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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树的性质与操作:吸收红结点及其对树结构的影响

红黑树的性质与操作&#xff1a;吸收红结点及其对树结构的影响 1.红黑树的基本性质2.吸收红结点的过程2.1黑色结点的度2.2 叶结点深度 3.伪代码实现4. C语言代码实现5. 结论 红黑树作为一种高效的自平衡二叉搜索树&#xff0c;在计算机科学中扮演着重要的角色。它通过一系列复杂…

开源软件技术社区方案

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台&#xff0c;主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境&#xff0c;实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢&#xff0c;…

电池二次利用走向可持续大循环周期的潜力和挑战(第一篇)

一、背景 当前&#xff0c;气候变化是全球可持续发展面临的重大挑战。缓解气候变化最具挑战性的目标是在本世纪中期实现碳中和&#xff08;排放量低到足以被自然系统安全吸收&#xff09;&#xff0c;其中电动汽车&#xff08;EV&#xff09;的引入是一项关键举措。电动汽车在…

CSS3新增的语法(三)【2D,3D,过渡,动画】

CSS3新增的语法&#xff08;三&#xff09;【2D,3D,过渡&#xff0c;动画】 10.2D变换10.1. 2D位移10.2. 2D缩放10.3. 2D旋转10.4. 2D扭曲&#xff08;了解&#xff09;10.5. 多重变换10.6. 变换原点 11. 3D变换11.1. 开启3D空间11.2. 设置景深11.3. 透视点位置11.4. 3D 位移11…

为 AI 而生的编程语言「GitHub 热点速览」

Mojo 是一种面向 AI 开发者的新型编程语言。它致力于将 Python 的简洁语法和 C 语言的高性能相结合&#xff0c;以填补研究和生产应用之间的差距。Mojo 自去年 5 月发布后&#xff0c;终于又有动作了。最近&#xff0c;Mojo 的标准库核心模块已在 GitHub 上开源&#xff0c;采用…

【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

目录 1、bean是什么 2、配置bean 2.1、使用Bean注解配置Bean 2.2、使用Import注解配置Bean 3、实例化Bean 1、bean是什么 在 Spring 中&#xff0c;Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管…

链表之单链表

上一篇博客我们学习了线性表中的顺序表&#xff0c;这一篇博客让我们继续往下了解线性表的链表&#xff0c;链表分为好几种结构&#xff0c;活不多说&#xff0c;让我们开始学习吧&#xff01; 目录 1.链表 2.链表的结构 3.单链表的实现 1.链表 1.概念&#xff1a;它是一种物…

Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件

Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件&#xff0c;同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载&#xff1a;Folder Icons for Mac v1.8 激活版 以下是这款软件的一…

【2024系统架构设计】案例分析- 5 Web应用

目录 一 基础知识 二 真题 一 基础知识 1 Web应用技术分类 大型网站系统架构的演化:高性能、高可用、可维护、应变、安全。 从架构来看:MVC,MVP,MVVM,REST,Webservice,微服务。

Spark-Scala语言实战(11)

在之前的文章中&#xff0c;我们学习了如何在spark中使用RDD中的cartesian,subtract最终两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scal…

数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)

当你觉的自己不行时&#xff0c;你就走到斑马线上&#xff0c;这样你就会成为一个行人 一、交换排序 1.冒泡排序 BubbleSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.快速排序 QuickSort 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 …

【JAVASE】面向对象程序三大特性之一( 封装)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609;\n &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1.包的使用 2.static关键字的使用 3.代码…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况&#xff0c;用苹果手表Apple Watch录音&#xff0c;有的录1个多小时&#xff0c;有的录了3、4小时&#xff0c;甚至更长时间&#xff0c;因为手表没电&#xff0c;忘记保存等原因造成录音损坏&#xff0c;都是只能播放4秒&#xff0c;同步到手机也一样&…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…

【Django学习笔记(三)】BootStrap介绍

BootStrap介绍 前言正文1、BootStrap 快速了解2、初识BootStrap2.1 下载地址2.2 创建目录2.3 引入BootStrap2.4 使用BootStrap 3、BootStrap 组件&样式3.1 导航条3.2 栅格系统3.3 container3.3.1 container3.3.2 container-fluid 3.4 面板3.5 媒体对象3.6 分页3.7 图标3.7.…

外卖配送时间预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 外卖服务的兴起: 随着互联网技术和移动应用的发展&#xff0c;外卖成为一种日益普及的餐饮服务方式。顾客通过餐厅、杂货店的网站或移…

Qt中继承QCheckBox的类结合QTableWidget实现多选并且每个多选的id都不一样

1.相关描述 继承QCheckBox的类MyCheckBox&#xff0c;利用QTableWidget的setCellWidget方式添加MyCheckBox类的对象 2.相关页面 3.相关代码 mycheckbox.h #ifndef MYCHECKBOX_H #define MYCHECKBOX_H#include <QCheckBox> #include <QObject>class MyCheckBox : pu…

计算机网络:数据链路层 - 封装成帧 透明传输 差错检测

计算机网络&#xff1a;数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看&#xff0c;主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的&#xff0c;所谓链路就是从一个节点到相邻…

从0到1构建uniapp应用-store状态管理

背景 在 UniApp的开发中&#xff0c;状态管理的目标是确保应用数据的一致性&#xff0c;提升用户体验&#xff0c;并简化开发者的工作流程。通过合理的状态管理&#xff0c;可以有效地处理用户交互、数据同步和界面更新等问题。 此文主要用store来管理用户的登陆信息。 重要…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…