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广告变现# 接入第三方平台…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...