Java基础 - 代码练习
第一题:集合的运用(幸存者)

public class demo1 {public static void main(String[] args) {ArrayList<Integer> array = new ArrayList<>(); //一百个囚犯存放在array集合中Random r = new Random();for (int i = 0; i < 100; i++) {OUT:while (true) {int n = r.nextInt(200)+1; //生成随机数1-200//用for循环对比有没有重复比较复杂
// for (int j = 0; j < i; j++) {
// if(n==array.get(j)){ //随机数重复
// continue OUT;
// }
// }if(array.contains(n)){ //随机数重复continue OUT;}//说明没有重复的array.add(n);break OUT;}}System.out.println(array);ArrayList<Integer> arr = new ArrayList<>(); //保存一百个囚犯第一次的存放位置arr.addAll(array);System.out.println(arr);//题中要求位置从1开始计数,现在我们的位置是从0开始,所以后续计算要+1while(array.size()>1){for (int i = array.size()-1; i>=0; i--) {if((i+1)%2==1){ //奇数位置array.remove(i);}}System.out.println(array);}System.out.println("幸存者编号:" + array.get(0));System.out.print("幸存者第一次所占的位置(从1开始算):");System.out.print(arr.indexOf(array.get(0)) + 1);}
}
第二题:基础编程能力

//User
public class User {private Long id; //用户idprivate String name; //用户名private String gender; //用户性别private LocalDate birthday; //用户生日public User() {}public User(Long id, String name, String gender, LocalDate birthday) {this.id = id;this.name = name;this.gender = gender;this.birthday = birthday;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public LocalDate getBirthday() {return birthday;}public void setBirthday(LocalDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", birthday=" + birthday +'}';}
}//demo2
public class demo2 {public static void main(String[] args) {//创建一个ArrayList集合List<User> users = new ArrayList<>();//解析字符串String userStrs = "10001:张三:男:1990-01-01#10002:李四:女:1989-01-09#10003:王五:男:1999-09-09#10004:刘备:男:1899-01-01#10005:孙悟空:男:1900-01-01#10006:张三:女:1999-01-01#10007:刘备:女:1999-01-01#10008:张三:女:2003-07-01#10009:猪八戒:男:1900-01-01";String[] strs = userStrs.split("#"); //用#号把每个用户的数据先拆分开//System.out.println(Arrays.toString(strs)); //[10001:张三:男:1990-01-01, 10002:李四:女:1989-01-09, 10003:王五:男:1999-09-09, 10004:刘备:男:1899-01-01, 10005:孙悟空:男:1900-01-01, 10006:张三:女:1999-01-01, 10007:刘备:女:1999-01-01, 10008:张三:女:2003-07-01, 10009:猪八戒:男:1900-01-01]for (int i = 0; i < strs.length; i++) {String s = strs[i];String[] str2 = s.split(":"); //用:号把每个用户的个人数据(id 姓名 性别 生日)拆分开//str2[0]代表id str2[1]代表姓名 str2[2]代表性别 str2[3]代表生日long id = Long.parseLong(str2[0]); //把用户id从String型转换成long型//long id = Long.valueOf(str2[0]); //把用户id从String型转换成long型//把生日转换成从字符串转换成LocalDateLocalDate birth = LocalDate.parse(str2[3]);
// String[] time = str2[3].split("-"); //time[0]代表年 time[1]代表月 time[2]代表日
// int year = Integer.parseInt(time[0]);
// int month = Integer.parseInt(time[1]);
// int day = Integer.parseInt(time[2]);
// LocalDate birth = LocalDate.of(year,month,day);User user = new User(id,str2[1],str2[2],birth);users.add(user);}System.out.println(users);System.out.println("============================================");//遍历List<User>集合,统计每个名字出现的次数Map<String,Integer> map = new HashMap<>();for (int i = 0; i < users.size(); i++) {User user = users.get(i);if(map.containsKey(user.getName())){ //如果用户的名字在map的键中存在map.put(user.getName(),map.get(user.getName())+1);}else{ //如果用户的名字在map的键中第一次出现map.put(user.getName(),1);}}//System.out.println(map);map.forEach((k,v) -> System.out.println(k+":"+v+"次"));}
}
第三题:JDK8新时间的应用

public class demo3 {public static void main(String[] args) {LocalDate ld = LocalDate.of(2022,2,3); //记录首次休息日Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入您查询月份(XXXX-X):");String s = sc.next();if(!s.matches("\\d{4}-\\d{1,2}")){System.out.println("您输入的时间格式不正确,请重新输入");continue;}else {String[] str = s.split("-");int year = Integer.parseInt(str[0]); //查询的年份int month = Integer.parseInt(str[1]); //查询的月份呢if(month > 12 || month < 1){ //查询的月份不是1-12之间System.out.println("请输入正确的月份(1-12)~~~");}else if (year < 2022 || (year == 22 && month <= 2)) { //查询月份不在2022年2月之后System.out.println("请输入2022年2月之后的月份~~~");} else { //查询月份在2022年2月之后 且 月份符合规范(1-12)int days = dayNum(year, month); //该月有几天//打印该月的上班情况for (int i = 1; i < days; i++) {LocalDate date = LocalDate.of(year, month, i);//判断该日是否是休息日Long next = date.toEpochDay() - ld.toEpochDay(); //获取相差天数if (next % 3 == 0) {System.out.print(date + "[休息]");//判断休息日是否是周末(周六 周日)if(date.getDayOfWeek() == DayOfWeek.SATURDAY){System.out.print("[周六] ");}else if(date.getDayOfWeek() == DayOfWeek.SUNDAY){System.out.println("[周日] ");}else{System.out.print(" ");}} else if (next % 3 == 1 || next % 3 == 2) {System.out.print(date + " ");}}break;}}}}public static int dayNum(int year, int month) {int num = 0;switch (month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:num = 31;break;case 4:case 6:case 9:case 11:num = 30;break;case 2:if((year%4==0 && year%100!=0) || (year%400==0)){//闰年num = 29;}else{num = 28;}break;default:System.out.println("月份有误");break;}return num;}
}
第四题:手写ArrayList集合

//MyArrayList
public class MyArrayList<E> {private Object[] arr = new Object[10];private int count = 0; //记录数组中现存有几个数据private double gene = 0.8; //激活因子//往集合中添加数据(返回值是boolean类型)public boolean add(E e){arr[count] = e;count++;if(count >= arr.length * gene){Object[] arr1 = Arrays.copyOf(arr,arr.length * 2); //如果数组中的数据个数等于或超过数组最大范围的80%,则扩容两倍arr = arr1;}//System.out.println(Arrays.toString(arr));//但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位//比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]
// Object[] rs = Arrays.copyOf(arr,count);
// System.out.println(Arrays.toString(rs));return true;}//根据索引查询指定元素public E get(int index) {//但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位//比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]//因此用户输入超过他自己存入个数的索引值,就产生了越界if(index >= count || index < 0){ //索引值越界throw new ArrayOutException("您输入的索引越界");}else{return (E) arr[index];}}//根据索引删除指定元素(返回值是被删除的元素)public E remove(int index){if(index >= count || index < 0) { //索引值越界throw new ArrayOutException("您输入的索引越界");}else{E e = (E) arr[index]; //记录被删除元素//删除的元素是最后一个元素if(index == arr.length-1){ //由于扩容机制,所以不会删除的元素永远不会是数组的最后一个arr[index] = null;return e;}//删除的元素不是最后一个元素,需要进行移位(后面的数前移)for (int i = index + 1; i < arr.length; i++) {if(i != arr.length-1){arr[i-1] = arr[i];}else{arr[i] = null; //由于扩容机制,永远都没有存满,最后一位永远是null,因此最后一个数的前移不会导致最后一位多出来一个重复的数}}//System.out.println(Arrays.toString(arr));count--; //数组元素个数-1//但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位//比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]
// Object[] rs = Arrays.copyOf(arr,count);
// System.out.println(Arrays.toString(rs));return e;}}//返回集合大小public int size(){return count;}//遍历集合public void forEach1(){for (int i = 0; i < count; i++) {System.out.print(arr[i]+ " ");}System.out.println();}//遍历集合(可以用Lambda表达式)public void forEach(MyConsumer<E> action){Objects.requireNonNull(action);for (int i = 0; i < count; i++) {action.accept((E) arr[i]);}}public String toString() {StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < count; i++) {E e = (E) arr[i];sb.append(e).append(i==count-1?"":", "); //判断该元素是否是最后一个数据,是否需要加,}sb.append("]");return sb.toString();}
}//MyConsumer
public interface MyConsumer<E> {void accept(E e);
}//ArrayOutException
public class ArrayOutException extends RuntimeException{public ArrayOutException(){}public ArrayOutException(String message){super(message);}
}//demo4
public class demo4 {public static void main(String[] args) {MyArrayList<Integer> arr = new MyArrayList<>();arr.add(11);arr.add(22);arr.add(33);arr.add(44);arr.add(55);arr.add(66);arr.add(77);arr.add(88);arr.add(99);System.out.println(arr); //[11, 22, 33, 44, 55, 66, 77, 88, 99]System.out.println(arr.size()); //集合大小 9System.out.println(arr.get(8)); //索引8是99//System.out.println(arr.get(11)); //您输入的索引越界//System.out.println(arr.get(-1)); //您输入的索引越界System.out.println(arr.remove(7)); //返回被删除的元素88System.out.println(arr.size()); //集合大小 8arr.forEach1(); //11 22 33 44 55 66 77 99arr.forEach((Integer integer) -> System.out.print(integer + " ")); //11 22 33 44 55 66 77 99}
}
第五题:二分查找的应用

public class demo5 {public static void main(String[] args) {int[] nums = {};int target = 0;int[] rs = isExist(nums,target);System.out.println(Arrays.toString(rs));}//查找目标值对应的最左边的位置public static int getLeftIndex(int[] nums, int target){int rs = -1; //数据不存在为-1//二分查找int left = 0;int right = nums.length-1;while (left<=right){int middle = (left + right) / 2;if(nums[middle]==target){rs = middle; //先临时存放第一次找到目标值的位置//二分查找该元素的 左边 是否还存在目标值right = middle - 1;}else if(nums[middle] < target){left = middle + 1;}else if(nums[middle] > target){right = middle - 1;}}return rs;}//查找目标值对应的最右边的位置public static int getRightIndex(int[] nums, int target){int rs = -1; //数据不存在为-1//二分查找int left = 0;int right = nums.length-1;while (left<=right){int middle = (left + right) / 2;if(nums[middle]==target){rs = middle; //先临时存放第一次找到目标值的位置//二分查找该元素的 右边 是否还存在目标值left = middle + 1;}else if(nums[middle] < target){left = middle + 1;}else if(nums[middle] > target){right = middle - 1;}}return rs;}//复杂度O(log2n)public static int[] isExist(int[] nums, int target) {int[] rs = {-1,-1}; //记录返回值if(nums == null ||nums.length == 0){ //如果 数组不存在 或 数组为空return rs;}//数组不为空rs[0] = getLeftIndex(nums,target);rs[1] = getRightIndex(nums,target);return rs;}//复杂度O(n)public static int[] isExist1(int[] nums, int target) {int[] rs = new int[2];int count = 0; //记录第几次找到该数字for (int i = 0; i < nums.length; i++) {if(nums[i] == target && count == 0){ //第一次找到该数字rs[0] = i;count++;}else if(nums[i] == target && count != 0){ //不是第一次找到该数字rs[1] = i;count++;}}if(count == 0){ //说明未找到rs[0] = -1;rs[1] = -1;}return rs;}
}
第六题:手写链表、反转链表


//MyLinkedList
public class MyLinkedList<E> {private int size;/*** 定义了一个私有的内部类,作为链表的结点*/public static class Node<E>{E data;Node<E> next;public Node(E data, Node<E> next) {this.data = data;this.next = next;}}public Node<E> add(){Node<E> head = null;Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入当前结点的数据值(exit为结束):");String data = sc.next();if(data.equals("exit")){ //如果输入的是exit则结束break;}//输入不是exitif(head==null){ //第一次创建结点head = new Node(data,null);size++;}else{//已存在头结点,往后插入结点(尾插法)Node<E> temp = head;//让temp走到尾部while(temp.next != null){temp = temp.next;}//把当前结点值创建出来,加入尾部temp.next = new Node(data,null);size++;}}return head; //返回链表是返回链表的头结点}public Node<E> reverse(Node<E> head,int left,int right){if(head == null || left < 1 || left > size || right < 1 || right > size || left >= right){return head;}//反转//先找到左结点的位置//从左结点遍历到右结点,然后把数据存到集合中Node<E> first = head; //遍历结点标识Node<E> mark = null; //记录左结点List<E> data = new ArrayList<>();int index = 0;while(first != null){index++;if(index == left){mark = first;}if(index>=left && index<=right){data.add(first.data);}if(index == right){break;}first = first.next;}//倒序遍历集合for (int i = data.size()-1; i >= 0; i--) {E e = data.get(i);mark.data = e;mark = mark.next;}return head;}public void forEach(Node<E> head){if(head == null){System.out.println(head);return;}while(head != null){System.out.print(head.data+" ");head = head.next;}System.out.println();}}//demo6
public class demo6 {public static void main(String[] args) {MyLinkedList<String> list = new MyLinkedList<>();MyLinkedList.Node<String> head = list.add();list.forEach(head);MyLinkedList.Node<String> head2 = list.reverse(head,2,5);list.forEach(head2);}
}
相关文章:
Java基础 - 代码练习
第一题:集合的运用(幸存者) public class demo1 {public static void main(String[] args) {ArrayList<Integer> array new ArrayList<>(); //一百个囚犯存放在array集合中Random r new Random();for (int i 0; i < 100; …...
【Redis】redis集群模式
概述 Redis集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。实际使用中集群一般由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护&#…...
基于opencv的猫脸识别模型
opencv介绍 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…...
基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用
基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用 摘要引言方法 Segmentation information with attention integration for classification of breast tumor in ultrasound image 摘要 乳腺癌是世界范围内女性最常见的癌症之一。基于超声成像的计算机辅助诊断&#x…...
数据库重点知识(个人整理笔记)
目录 1. 索引是什么? 1.1. 索引的基本原理 2. 索引有哪些优缺点? 3. MySQL有哪几种索引类型? 4. mysql聚簇和非聚簇索引的区别 5. 非聚簇索引一定会回表查询吗? 6. 讲一讲前缀索引? 7. 为什么索引结构默认使用B…...
[技术闲聊]checklist
电路设计完成后,需要确认功能完整性,明确是否符合设计规格需求;需要确认电路设计是否功能符合但是系列项不符合设计规则,如果都没有问题,那么就可以发给layout工程师。 今天主要讲讲电路设计规则,涉及到一…...
力扣刷题 二叉树的迭代遍历
题干 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输…...
【二】Django小白三板斧
今日内容 静态文件配置 request对象方法初识 pycharm链接数据库(MySQL) django链接数据库(MySQL) Django ORM简介 利用ORM实现数据的增删查改 【一】Django小白三板斧 HttpResponse 返回字符串类型的数据 render 返回HTML文…...
MyBatis的基本应用
源码地址 01.MyBatis环境搭建 添加MyBatis的坐标 <!--mybatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!--mysql驱动坐…...
Day80:服务攻防-中间件安全HW2023-WPS分析WeblogicJettyJenkinsCVE
目录 中间件-Jetty-CVE&信息泄漏 CVE-2021-34429(信息泄露) CVE-2021-28169(信息泄露) 中间件-Jenkins-CVE&RCE执行 cve_2017_1000353 CVE-2018-1000861 cve_2019_1003000 中间件-Weblogic-CVE&反序列化&RCE 应用金山WPS-HW2023-RCE&复现&上线…...
使用generator实现async函数
我们先来看一下async函数是怎么使用的 const getData (sec) > new Promise((resolve) > {setTimeout(() > resolve(sec * 2), sec * 1000);})// aim to get this asycnFun by generator async function asyncFun() {const data1 await getData(1);const data2 awa…...
go并发请求url
sync.WaitGroup写法 package mainimport ("database/sql""fmt""net/http""sync""time"_ "github.com/go-sql-driver/mysql" )func main() {//开始计时start : time.Now()//链接数据库,用户名…...
刷题之Leetcode704题(超级详细)
704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&am…...
leetcode热题100.前k个高频元素
作者:晓宜 🌈🌈🌈 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力😊 Problem: 347. 前 K 个高频元…...
LangChain Demo | Agent X ReAct X wikipedia 询问《三体》的主要内容
背景 LangChain学习中,尝试改了一下哈里森和吴恩达课程当中的问题,看看gpt-3.5-turbo在集成了ReAct和wikipedia后,如何回答《三体》的主要内容是什么这个问题,当然,主要是为了回答这问题时LangChain内部发生了什么。所…...
Revit 2025新功能一览~
Hello大家好!我是九哥~ Revit2025已经更新,安装后,简单试了下,还是挺不错的,流畅度啊,新功能啊,看来还是有听取用户意见的,接下来就简单看看都有哪些新功能。 好了,今天的…...
Head First Design Patterns -代理模式
什么是代理模式 代理模式为另一个对象提供替身或者占位符,以便控制客户对对象的访问,管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理:管理客户和远程对象之间的交互。 虚拟代理:控制访问实例化开销大的对…...
第十三题:天干地支
题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(w)、己&a…...
8000预算可以购买阿里云服务器配置整理
一个月8000元预算如何选择阿里云服务器配置?八千预算可选的阿里云服务器配置相当高了,这个预算可以购买阿里云企业级独享型云服务器,至少8核以上的配置,这个预算可以支持复杂、高负载或大规模的业务需求。阿里云服务器网整理8000元…...
游戏APP如何提高广告变现收益的同时,保证用户留存率?
APP广告变现对接第三方聚合广告平台主要通过SDK文档对接,一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀,导致APP被封控,设置列入黑名单,借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
