JAVA-案例练习-基础进阶复习

关于JAVA学习后的一些复习题目,提供一些解法和总结一下自己的学习问题。

目录

1.集合的灵活应用

需求:

代码实现 

2.数据分割转换和统计

需求:

 代码实现

3.休息日计算

需求:

代码实现

4.数组模拟

需求

 代码实现

5.数组排列

需求

代码实现 

6.链表问题

需求

*7.问题总结


1.集合的灵活应用

需求:

目前有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;
    }
}

试做思路:创建好囚犯对象和对象集合,再按顺序进行随机数生成排序队列,如果是奇数位,就删除


2.数据分割转换和统计

需求:

        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集合时统计数量


3.休息日计算

需求:

        某护士小花作息规律为上两天班休息一天,经常不确定休息日是否是周末。(注,首次休息日是2022年2月3日)

具体功能点的要求如下:

  1. 请你开发一个程序,当小花输入年级以及月后,立即显示出该月份的休息日详情示例 (示范信息重点在参考格式结果不一定准确。请自行确保计算结果正确性)
  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("周日");}
        });
    }
}

4.数组模拟

需求

ArrayList集合是一种很重要的集合,请手工书写一个MyArrayList的集合模拟ArrayList集合

具体工作点的要求如下

  1.  需要支持泛型内部使用数组作为容器。
  2.  在array list中开发的功能用于添加数据需要遵循ArrayList的扩容机制自行设计代码,不需要和ArrayList的源代码一样思想一致即可。
  3.  ArrayList的开发根据索引查询数据的get方法。
  4.  在MyArrayList中开发根据索引删除数据的Remove方法
  5.  开发一个获取集合大小的size
  6.  能够在集合中开发一个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);
    }
}

5.数组排列

需求

        给你一个按照非递减顺序排列的整数数组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;
    }

}

6.链表问题

需求

        给出单链表的头指针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();
            int index =0;
           
        }
    }
}


*7.问题总结

        主要问题是对于JAVA的常见API不熟悉,需要去整合复习,还要回顾一下一些语法知识,总是在类和接口中出现问题。

你可能感兴趣的:(JAVA学习笔记,java,笔记)