关于JAVA学习后的一些复习题目,提供一些解法和总结一下自己的学习问题。
目录
1.集合的灵活应用
需求:
代码实现
2.数据分割转换和统计
需求:
代码实现
3.休息日计算
需求:
代码实现
4.数组模拟
需求
代码实现
5.数组排列
需求
代码实现
6.链表问题
需求
*7.问题总结
目前有100名囚犯,每个囚犯的编号是1~200之间的随机数。现在要求依次随机生成1~100名囚犯的编号,要求这些囚犯的编号是不能重复的,然后让他们依次站成一排。(位置是从一开始计数的)接下来国王命令首先先干掉全部奇数位置的人。然后剩下的人又重新从位置一开始再次干掉全部奇数位置的人。以此类推,直到剩下最后一个人为止,剩下的这个人为幸存者。
具体功能点的要求
请输出幸存者的编号以及它第一次所占的位置值是多少?
评分细则
- 能做出第一步,产生100个随机编号且站位成功的给3分。
- 能成功删除奇数位置的数据给5分
- 能得到正确结果的给2分。
package Demo_huangpu;
public class DO {
private int oid;
private int id;
private int wei;
public int getOid() {
return oid;
}
public void setOid(int oid) {
this.oid = oid;
}
public DO() {
}
@Override
public String toString() {
return "| " + id +
" : " + wei;
}
public DO(int id, int wei) {
this.id = id;
this.wei = wei;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getWei() {
return wei;
}
public void setWei(int wei) {
this.wei = wei;
}
}
package Demo_huangpu;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Demo1 {
public static void main(String[] args) {
List dos = new ArrayList<>();
Random r = new Random();
for (int i = 1; i <= 100; i++) {
DO d = new DO();
d.setId(i);
d.setOid(i);
while (true) {
int q = r.nextInt(200) + 1;
d.setWei(q);
if (!exist(dos, d)) {
dos.add(d);
break;
}
}
}
System.out.println(dos);
while (dos.size() != 1) {
for (int i = 0; i < dos.size(); i++) {
DO pass = dos.get(i);
if (pass.getId() % 2 == 0) {
pass.setId(pass.getId() / 2);
} else if (pass.getId() % 2 == 1) {
dos.remove(pass);
}
}
}
System.out.println(dos.size());
dos.get(0).setId(dos.get(0).getId() / 2);
System.out.println("幸存者的编号是:" + dos.get(0).getWei());
System.out.println("幸存者初始位置"+dos.get(0).getOid());
}
private static boolean exist(List list,DO o) {
for (DO aDo : list) {
if (aDo.getWei() == o.getWei()) {
return true;
}
}
return false;
}
}
试做思路:创建好囚犯对象和对象集合,再按顺序进行随机数生成排序队列,如果是奇数位,就删除
User实体类内,包含如下属性用户:ID,姓名,性别,生日,注意提供set,get方法以及toString方法。
新建测试类类中方法,方法中完成如下业务逻辑:
业务一:有字符串。里面包含多个用户信息数据,现在需要你解析这个字符串获取里面的用户数据。并封装的user对象中多个user对象再添加到List user集合中。
注意:字符串中的规则如下:多个用户用#号拼接。用户之间用:拼接,其中用户ID和生日是需要进行类型转换的,其中ID需要将string转换成long。生日需要将string转换成local Date
业务二:遍历上面获得的list user集合统计里面每个名字出现的次数。封装到map,string,Integer集合中,其中key就是名字。value就是名字出现的次数。
package Demo_huangpu.D02;
import java.time.LocalDate;
public class User {
private Long id;
private String name;
private String gender;
private LocalDate birthday;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday=" + birthday +
'}';
}
public String getName() {
return name;
}
public User(Long id, String name, String gender, LocalDate birthday) {
this.id = id;
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
public void setName(String name) {
this.name = name;
}
public User() {
}
public User(Long id, String gender, LocalDate birthday) {
this.id = id;
this.gender = gender;
this.birthday = birthday;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
}
package Demo_huangpu.D02;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Text {
public static void main(String[] args) {
String userStr = "10001:张三:男:1990-01-01#" +
"10002:李四:男:1989-01-09#" +
"10003:王五:男:1990-09-09#" +
"10004:刘备:男:1899-01-01#" +
"10005:孙悟空:男:1900-01-01#" +
"10006:张三:女:1999-01-01#" +
"10007:张三:男:1990-01-01#" +
"10008:刘备:女:1990-01-01#" +
"10009:猪八戒:男:1900-01-01#";
List users = new ArrayList<>();
String[] strArray = userStr.split("#");
for (String s : strArray) {
User user = new User();
String [] data = s.split(":");
user.setId(Long.valueOf(data[0]));
user.setName(data[1]);
user.setGender(data[2]);
user.setBirthday(LocalDate.parse(data[3]));
users.add(user);
}
Map map = new HashMap<>();
for (User user : users) {
String name = user.getName();
if(map.containsKey(name)){
map.put(name,map.get(name)+1);
}
else{
map.put(name,1);
}
}
map.forEach((k,v)->System.out.println(k+v+"次"));
}
}
试做思路:主要是将String中的数据按照符号分割好存入到String数组中再遍历存入List集合中,最后在从List转换到Map集合时统计数量
某护士小花作息规律为上两天班休息一天,经常不确定休息日是否是周末。(注,首次休息日是2022年2月3日)
具体功能点的要求如下:
- 请你开发一个程序,当小花输入年级以及月后,立即显示出该月份的休息日详情示例 (示范信息重点在参考格式结果不一定准确。请自行确保计算结果正确性)
- 显示出该月份哪些休息日是周六或周日?请依次列出具体的日期及星期信息。
- //小花给自己设置了一个高考倒计时。高考的开始时间为2023年6月7日上午9点。请利用给的素材代码在Timer文件夹补全代码产生一个如下的倒计时效果。(没有去实现)
package Demo_huangpu.DO3;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
//1.起始休息日
LocalDate startDate = LocalDate.of(2022,2,3);
//2.拿到用户查询的年份和月份
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查询的年份和月份");
String currentDate = sc.next()+ "-01";
// DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM");
LocalDate endDate = LocalDate.parse(currentDate);
LocalDate emdMonthFirstDay = endDate;
endDate = endDate.plusMonths(1).minusDays(1);
List days = new ArrayList<>();
while(startDate.isBefore(endDate)){
Day day = new Day(startDate);
days.add(day);
//日子移动
startDate = startDate.plusDays(1);
}
for (int i = 0; i < days.size(); i+=3) {
Day day = days.get(i);
day.setFlag(true);
}
List currentDateRest = new ArrayList<>();
for (int i = 0; i < days.size(); i++) {
Day day = days.get(i);
if(day.getDate().isBefore(emdMonthFirstDay)){
continue;
}
currentDateRest.add(day);
day.printInfo();
}
currentDateRest.stream().filter(d->(d.getDate().getDayOfWeek().getValue() ==6 ||d.getDate().getDayOfWeek().getValue() == 7) && d.isFlag()).forEach(d->{
System.out.println(d);
if(d.getDate().getDayOfWeek().getValue() ==6 ){
System.out.println("周六");
}
else{ System.out.println("周日");}
});
}
}
ArrayList集合是一种很重要的集合,请手工书写一个MyArrayList的集合模拟ArrayList集合
具体工作点的要求如下
- 需要支持泛型内部使用数组作为容器。
- 在array list中开发的功能用于添加数据需要遵循ArrayList的扩容机制自行设计代码,不需要和ArrayList的源代码一样思想一致即可。
- ArrayList的开发根据索引查询数据的get方法。
- 在MyArrayList中开发根据索引删除数据的Remove方法
- 开发一个获取集合大小的size
- 能够在集合中开发一个foreach方法。这个方法支持lama进行遍历,函数式接口名称无 所谓,其编写测试用例,对自己编写的list进行集合的正确性测试。
package Demo_huangpu.Do4;
public interface MyConsumer {
void accept(T t);
}
package Demo_huangpu.Do4;
import java.util.Arrays;
import java.util.Objects;
public class MyArrayList {
private Object[] elementData = {};
private int size;
private int Max = 10;
public boolean add(T t){
//判断是否需要扩容
if(size == elementData.length){grow();}
elementData[size++] = t;
return true;
}
private void grow() {
if(size == 0){
elementData = new Object[Max];
}
else{
elementData = Arrays.copyOf(elementData,elementData.length>>1+elementData.length);
}
}
public T get(int index){
if(index <0 ||index >= elementData.length){
throw new IndexOutOfBoundsException(index + "out of length "+ size);
}
return (T) elementData[index];
}
public int getSize(){
return size;
}
public T remove(int index){
for(int i = index;i action){
Objects.requireNonNull(action);
for (int i = 0; i < size; i++) {
action.accept((T) elementData[i]);
}
}
}
package Demo_huangpu.Do4;
public class Text {
public static void main(String[] args) {
MyArrayList list = new MyArrayList<>();
list.add("韩");
System.out.println(list);
}
}
给你一个按照非递减顺序排列的整数数组nums。和一个目标值target,请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,请返回-[1,-1]。
注意,必须确保程序的时间复杂度为o (log2n)
数组具体功能点的要求如下,
数组nums= [5,7,7,8 8,10],terget = 8,得到的结果是[3,4]。
数组ns等于空等于零的结果为[-1,-1],请设计一个方法完成上去的。要求并编写测试代码,完成上述测试。
package Demo_huangpu.Do5;
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
int [] arr = {5,7,7,8,8,10};
int target;
Scanner sc = new Scanner(System.in);
System.out.println("请输入目标值");
target = sc.nextInt();
int[] result = postion(arr,target);
System.out.println("["+result[0]+","+result[1]+"]");
}
private static int[] postion(int[] arr, int target) {
int[] result = new int[2];
result[0] =-1;
result[1] =-1;
int pass= 0;
for (int i = 0; i < arr.length; i++) {
int num = arr[i];
if(num == target){
if(pass == 0){
result[0] = i;
}
else{
result[1] = i;
}
pass++;
}
}
return result;
}
}
给出单链表的头指针head和两个整数lift和right。其中lift小于等于right,请你反转位置lift到位置rest的链表节点。并返回反转后的列表。比如head指向的列表内容大致是12345,lif=2,right = 4,反转后的列表就是14325。
设计一个node类型用于代表链表的节点。每个节点包含数据data和下一个节点的地址next。开发一个类叫MyLinklist,其中一个爱的方法可以让用户添加链表的节点,直到用户输入exit,则返回链表,返回链表实际上是返回链表的。节点提供一个relieve方法,接收头节点和两个整数lift和right。其中lift小于等于right,按照上面要求进行反转,反转后返回新的列表。提供一个foreach方法接收新电表并对其遍历输出。
package Demo_huangpu.DO6;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MyLinkedList {
public static class Node() {
E data;
int size;
Node next;
public Node(E data, Node next) {
this.data = data;
this.next = next;
}
public void add() {
Node head = null;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入节点内容 输入exit退出输入");
String da = sc.next();
if (da.equals("exit")) {
break;
}
if (head == null) {
head = new Node(data, null);size++;
} else {
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = new Node(data, null); size++;
}
}
}
public void forEach(Node head) {
if (head == null) {
System.out.println(head);
return;
}
while (head != null) {
System.out.println(head.data + " ");
head = head.next;
}
}
public Node reverse(Node head,int left,int right){
if(head ==null || left<1 || left>size|| right<1 || right>size ||left ==right){
return head;
}
Node mark = null;
List data = (List) new ArrayList
主要问题是对于JAVA的常见API不熟悉,需要去整合复习,还要回顾一下一些语法知识,总是在类和接口中出现问题。