进阶JAVA篇- Java 综合基本语法实践(习题一)

                         路漫漫其修远兮,吾将上下而求索。—— 屈原


目录

        第一道题:集合的灵活运用

        第二道题:基础编程能力

        第三道题: 手写 ArrayList 集合(模拟实现 ArrayList 核心API)

        第四道题:二分查找的应用

        第五道题:手写单链表(模拟实现 LinkedList 集合的核心API)


        第一道题:集合的灵活运用

题目如下:

对题目进行分析:

      可以根据囚犯的编号、所占的位置信息,可以封装成一个囚犯类,接着就是遍历 100 个人的信息了,推荐可以用 for 来遍历。这里要注意的是不能重复出现相同的编号,这里可以单独构造一个方法,去除重复的编号。对于删除奇数位置上的数据,那么新 new 一个集合来接收占位为偶数的元素就好了。这题不算难,可以根据题目自己试着敲一敲。

 具体代码如下:(答案肯定是不唯一的,答案对了,还有逻辑清晰即可)

先定义了囚犯类:

public class People {
    private int number;
    private int location;

    public People(int number, int location) {
        this.number = number;
        this.location = location;
    }

    public People() {
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getLocation() {
        return location;
    }

    public void setLocation(int location) {
        this.location = location;
    }

    @Override
    public String toString() {
        return "People{" +
                "number=" + number +
                ", location=" + location +
                '}';
    }
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Text {
    private  static List<People> peopleLists = new ArrayList<>();
    public static void main(String[] args) {

        Random random = new Random();
        for (int i = 1; i <= 100 ; i++) {
            //先判断取到的数是否重复了
            int number = random.nextInt(200)+1;
            if (isRepeat(number)){
                i--;
                continue;
            }else{
                People people = new People(number,i);
                peopleLists.add(people);
            }
        }
        System.out.println("原先的排位:");
        System.out.println(peopleLists);

        //除去在位在奇数位置的人,直到剩最后一位。
        //1,2,3,4,5,6,7,8
        //0,1,2,3,4,5,6,7
        //可以看出来就是要保留集合中的奇数位

        while (peopleLists.size() > 1){
            List<People> temp = new ArrayList<>();
            for (int i = 1; i < peopleLists.size(); i+=2) {
                temp.add(peopleLists.get(i));
            }
            peopleLists = temp;
        }
        System.out.println("后来的排位:");
        System.out.println(peopleLists.get(0));

    }
    private static boolean isRepeat(int number){
        for (int i = 0; i < peopleLists.size(); i++) {
            if (peopleLists.get(i).getNumber() == number) {
                return true;
            }
        }
        return false;
    }
}

        第二道题:基础编程能力

 题目如下:

对题目进行分析:

      先定义出来 User 实体类,这里难点在于将 userStrs 变量进行拆分为一个个字符串,这里就可以使用 split() 方法了,用数组来接收,先拆分 "#",再用数组接收 ":"的字符串,就拆调用两次 split() 方法即可,接着就是对数据的类型处理了,其中两个难点就是字符串 id 转变为 long 类型,就直接用 Long.valueof() 方法就行了,还有一个是转变 LocalDay birthday ,用 LocalDay.parse() 来解析字符串。再有就是封装到 Map 集合中,对原来的 list 集合遍历,再需要用到的是 containsKey() 方法来判断是否重复存在了,最后可以将数据放到 map 集合中了。

具体代码如下:(答案肯定是不唯一的,答案对了,还有逻辑清晰即可)

import java.time.LocalDate;

public class User {
    private Long id;
    private String gender;
    private LocalDate birthday;
    private String name;

    public User() {
    }

    public User(Long id, String gender, LocalDate birthday, String name) {
        this.id = id;
        this.gender = gender;
        this.birthday = birthday;
        this.name = name;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", gender='" + gender + '\'' +
                ", birthday=" + birthday +
                ", name='" + name + '\'' +
                '}';
    }
}

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) {
        List<User> userLists = 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[] userInformation = userStrs.split("#");
        for (int i = 0; i < userInformation.length; i++) {
            String[] userSpilt = userInformation[i].split(":");
            String idString = userSpilt[0];
            long id = Long.valueOf(idString);
            String name = userSpilt[1];
            String gender = userSpilt[2];
            String birthdayString = userSpilt[3];
            LocalDate birthday = LocalDate.parse(birthdayString);
            User user = new User(id,gender,birthday,name);
            userLists.add(user);
        }
        System.out.println(userLists);

        //遍历集合中的每个名字出现的次数
        Map<String,Integer> map = new HashMap<>();
        for (User userList : userLists) {
            if (map.containsKey(userList.getName())){
                map.put(userList.getName(),map.get(userList.getName())+1);
            }else {
                map.put(userList.getName(),1);
            }
        }
        //遍历打印map集合
        map.forEach((k,v)-> System.out.println(k+" : "+v));
    }
}

        第三道题: 手写 ArrayList 集合(模拟实现 ArrayList 核心API)

题目如下:

对题目进行分析:

       ArrayList 添加第一个元素时集合默认的大小为数组空间为 10 ,每当等于或者超过相关的值,就会扩容为原来的1.5倍,一直往后下去。重点在于一开始类中应该得设置一个 size = 0 ,这个成员变量很重要,即是代表了元素的个数,还可以是指向下一个应该添加元素的位置

具体代码如下:(答案肯定是不唯一的,答案对了,还有逻辑清晰即可)

public interface MyConsumer<E> {
    void accept(E e);
}
import java.util.Arrays;
public class MyArrayList <E>{
    private int defaultLength = 10;
    private Object[] arr = new Object[defaultLength];
    private int size = 0;

    public MyArrayList() {
    }
    //添加数据
    public boolean add(E e){
        //先判断arr数组是否要扩容
        if (isExpansion()){
            //已经扩容成功
            System.out.println("已经扩容了");

        }
        arr[size++] = e;
        return true;
    }
    //查询数据
    public E get(int index){
        if(index >= size || index < 0){
            throw new RuntimeException();
        }
        else {
            return (E)arr[index];
        }
    }
    //删除数据
    public E remove(int index) {
        if (index >= size || index < 0) {
            throw new RuntimeException();
        } else {
            E retainData = (E) arr[index];
            if (index != size - 1) {
                //1,2,3,4,5,6
                //0,1,2,3,4,5
                //int remainder = size - index - 1;
                for (int i = index; i < size - 1; i++) {
                    arr[i] = arr[i + 1];
                }
            }
            size--;
            return retainData;
        }
    }
    //获取集合大小size
    public int size(){
        return size;
    }
    //开发一个forEach方法
    public void forEach(MyConsumer myConsumer){
        for (int i = 0; i < size; i++) {
            myConsumer.accept(arr[i]);
        }
    }
    private boolean isExpansion(){
        if (size >= defaultLength){
            defaultLength = (int) (defaultLength * (1.5));
            Object[] temp = new Object[defaultLength];
            for (int i = 0; i < size; i++) {
                temp[i] = arr[i];
            }
            arr = temp;
            return true;
        }else {
            return false;
        }
    }

    @Override
    public String toString() {
        Object[] temp = new Object[size];
        for (int i = 0; i < size; i++) {
            temp[i] = arr[i];
        }
        return Arrays.toString(temp);
    }
}
public class Text {
    public static void main(String[] args) {
        MyArrayList<String> myArrayList = new MyArrayList<>();
        myArrayList.add("1");
        myArrayList.add("2");
        myArrayList.add("3");
        myArrayList.add("4");
        myArrayList.add("5");
        myArrayList.add("6");
        myArrayList.add("7");
        myArrayList.add("8");
        myArrayList.add("9");
        myArrayList.add("10");
        myArrayList.add("11");
        myArrayList.add("13");
        myArrayList.add("13");
        myArrayList.add("19");
        myArrayList.add("13");
        myArrayList.add("18");

        System.out.println(myArrayList);

        System.out.println("------------------");
        System.out.println(myArrayList.get(2));
        System.out.println("------------------");
        System.out.println(myArrayList.remove(3));
        System.out.println("删除的结果:"+myArrayList);
        System.out.println(myArrayList.size());
        System.out.println("---------遍历---------");
        myArrayList.forEach(System.out::println);
    }
}

        第四道题:二分查找的应用

题目如下:

对题目进行分析:

        这里注明了必须是确保程序的时间复杂度是 O(log2n),很显然就是要使用二分法来进行查找元素,用二分法来寻找目标元素的开始位置还有结束位置,那就可以用分别使用二分法来寻找开始位置还有结束位置,注意的是,若数组中不存在目标元素的话,就要返回-1

具体代码如下:(答案肯定是不唯一的,答案对了,还有逻辑清晰即可)

import java.util.Arrays;
public class BinaryLookup {
    public static void main(String[] args) {
        int[] arr = {7,7,7,8,8,8,10};
        int target = 9;
        int[] a = lookupRightAndLeft(arr,target);
        System.out.println(Arrays.toString(a));
    }
    public static int lookupLeft(int[] arr, int target){
        int left = 0;
        int right = arr.length-1;
        int isLeft = - 1;
        while (left <= right){
            int index = (left+right)/2;
            if ( arr[index] == target){
                isLeft = index;
                right = index - 1;
            } else if (arr[index] > target) {
                right = index - 1;
            }else {
                left = index + 1;
            }
        }
        return isLeft;
    }
    public static int lookupRight(int[] arr, int target){
        int left = 0;
        int right = arr.length-1;
        int isRight = - 1;
        while (left <= right){
            int index = (left+right)/2;
            if ( arr[index] == target){
                isRight = index;
                left = index + 1;
            } else if (arr[index] > target) {
                right = index - 1;
            }else {
                left = index + 1;
            }
        }
        return isRight;
    }
    public static int[] lookupRightAndLeft(int[] arr,int target){
        int[] returnArr = new int[2];
        int isLeft = lookupLeft(arr,target);
        int isRight = lookupRight(arr,target);
        returnArr[0] = isLeft;
        returnArr[1] = isRight;
        return returnArr;
    }
}

        第五道题:手写单链表(模拟实现 LinkedList 集合的核心API)

题目如下:

对题目进行分析:

        由于官方的 LinkedList 集合使用了内部类来实现的,所以为了保持一致,我们也使用内部类来模拟实现,单链表需要一个个节点来组成,因此,定义一个内部类来封装节点,节点无非就是数据还有该类型对象的引用,需要注意的是,这里需要设置泛型类,我感觉用以上的题目给的信息来实现 LinkedList 集合与原 LinkedList 集合差别会很大而且很乱,所以我做了一些改进。

 具体代码如下:(答案肯定是不唯一的,答案对了,还有逻辑清晰即可)

public interface MyConsumer<E> {
    void accept(E e);
}
public class MyLinkedList<E> {

    private int size = 0;
    private NodeCode hand;
    class NodeCode{
        E data;
        NodeCode nextNodeCode;

        public  NodeCode(E data, NodeCode nextNodeCode) {
            this.data = data;
            this.nextNodeCode = nextNodeCode;
        }
    }
    public NodeCode add(E e){
            if (hand == null){
                hand = new NodeCode(e,null);
            }else {
                NodeCode temp = hand;
                while (temp.nextNodeCode != null){
                    temp = temp.nextNodeCode;
                }
                temp.nextNodeCode = new NodeCode(e,null);
            }
        size++;
        return hand;
    }
    public void forEach(MyConsumer<E> myConsumer){
        NodeCode first = hand;
        while ( first!=null ){
            myConsumer.accept(first.data);
            first = first.nextNodeCode;
        }
    }
    public void reverse(int left,int right){
        NodeCode first = hand;
        int count = 1;
        NodeCode tempLeft = null;
        Object[] arr = new Object[right-left + 1];
        while (count <= right){
            if (count == left){
                tempLeft = first;
            }
            if (count >= left ) {
                arr[count-left] = first.data;
            }
            first = first.nextNodeCode;
            count++;
           /* if (count == right){
                arr[count-left] = first.data;
            }*/
        }
        for (int i = arr.length - 1; i >= 0; i--) {
            tempLeft.data = (E) arr[i];
            tempLeft = tempLeft.nextNodeCode;
        }
    }
}
public class Text {
    public static void main(String[] args) {

        MyLinkedList<Integer> myLinkedList = new MyLinkedList<>();
        myLinkedList.add(1);
        myLinkedList.add(2);
        myLinkedList.add(3);
        myLinkedList.add(4);
        myLinkedList.add(5);
        myLinkedList.add(6);
        myLinkedList.reverse(2,5);

        myLinkedList.forEach(new MyConsumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });

/*        MyLinkedList<String> myLinkedList = new MyLinkedList<>();
        myLinkedList.add("1");
        myLinkedList.add("2");
        myLinkedList.add("3");
        myLinkedList.add("4");
        myLinkedList.add("5");
        myLinkedList.add("5");
        myLinkedList.add("6");
        myLinkedList.add("6");
        myLinkedList.forEach(System.out::println);*/


/*        System.out.println("-----------------");
        LinkedList<String> list = new LinkedList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("5");
        list.add("6");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });*/
    }
}

        若可以完成大部分题目,很高心衷心地祝贺你,你的编程能力是极高的!!!

        想要进一步了解更多的相关 Java 知识,可以点击以下链接:小扳_-CSDN博客



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单的 UDP 网络程序

文章目录&#xff1a; 简单的UDP网络程序服务端创建套接字服务端绑定启动服务器udp客户端本地测试INADDR_ANY 地址转换函数关于 inet_ntoa 简单的UDP网络程序 服务端创建套接字 我们将服务端封装为一个类&#xff0c;当定义一个服务器对象之后&#xff0c;需要立即进行初始化…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)

文章目录 先看本次实现的最终效果前言素材一、绘制路径点和连线1. 新建Waypoint &#xff0c;绘制路径点和连线2. 绘制路径点按钮效果3. 显示路径顺序文本4. 实时修改路径点位置 二、生成敌人1. 固定生成敌人配置2. 随机生成敌人配置 三、对象池创造敌人四、控制敌人沿前面绘制…

SpringBoot3自动配置流程及原理、SpringBootApplication注解详解

参考尚硅谷课程: https://www.yuque.com/leifengyang/springboot3/vznmdeb4kgn90vrx https://www.yuque.com/leifengyang/springboot3/lliphvul8b19pqxp 1.自动配置流程及原理 核心流程总结: 1.导入starter&#xff0c;就会导入autoconfigure包 2.autoconfigure 包里面 有一个…

Leetcode hot100之“结合递归+二分“题目详解

1 总结 题目 215 (“数组中的第 K 个最大元素”) 和题目 4 (“寻找两个正序数组的中位数”) 之间的联系主要体现在它们都涉及到寻找一个有序集合中的第 k 个元素的问题。尽管这两个问题的具体应用场景和所处理的数据结构不同&#xff0c;它们共享相似的算法思想和技术。 题目…

在3+1的方向上展开结构加法4a3+4a14

4a3 4a14 - - 1 - - - - - - - - - - - - - 1 1 1 - 1 1 - 1 - - 1 - - - 要求得到的图片只能有4个点&#xff0c;并且需要最大限度的保留4a3和4a14两张图片的内在结构特征。 4个点的结构总可以认为是3个点的结构1合成的 - - 1 - - …

[PyTorch][chapter 63][强化学习-时序差分学习]

目录&#xff1a; 蒙特卡罗强化学习的问题 基于转移的策略评估 时序差分评估 Sarsa-算法 Q-学习算法 一 蒙特卡罗强化学习的的问题 有模型学习&#xff1a; Bellman 等式 免模型学习: 蒙特卡罗强化学习 迭代&#xff1a; 使用策略 生成一个轨迹&#xff0c; for t…

【网络奇遇记】我和因特网的初相遇2 —— 三种交换方式

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 前言一. 电路交换1.1 电路交换讲解1.2 电路交换实例 二. 分组交换1.1 分组交换讲解1.2 分组交换实例…

损失函数——KL散度(Kullback-Leibler Divergence,KL Divergence)

KL散度&#xff08;Kullback-Leibler Divergence&#xff0c;简称KL散度&#xff09;是一种度量两个概率分布之间差异的指标&#xff0c;也被称为相对熵&#xff08;Relative Entropy&#xff09;。KL散度被广泛应用于信息论、统计学、机器学习和数据科学等领域。 KL散度衡量的…

基于Java+SpringBoot制作一个智能用电小程序

在当今快节奏的生活中,高效利用能源变得越来越重要。制作一个智能用电小程序,旨在帮助您更智能地管理家庭电器的用电,从而提升能源利用效率,助您掌握用电情况,降低能耗成本,实现绿色低碳生活。 目录 一、小程序1.1 项目创建1.2 首页轮播图快捷导航iconfont图标引入

整理笔记——MOS管、三极管、IGBT

一、MOS管 在实际生活要控制点亮一个灯&#xff0c;例如家里的照明能&#xff0c;灯和电源之间就需要一个开关需要人为的打开和关闭。 再设计电路板时&#xff0c;如果要使用MCU来控制一个灯的开关&#xff0c;通常会用mos管或是三极管来做这个开关元件。这样就可以通过MCU的信…

kafka个人笔记

大部分内容源于https://segmentfault.com/a/1190000038173886, 本人手敲一边加强印象方便复习 消息系统的作用 解耦 冗余 扩展性 灵活性&#xff08;峰值处理 可恢复 顺序保证 缓冲 异步 解耦&#xff1a;扩展两边处理过程&#xff0c;只需要让他们遵守约束即可冗余&#xf…

网络层协议 ——— IP协议

文章目录 IP协议基本概念IP协议格式分片与组装网段划分特殊的IP地址IP地址的数量限制私网IP地址和公网IP地址路由路由表生成算法 IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议。 基本概念 网…

只使用JS怎么给静态页面网站添加站内全局搜索功能?

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 背景 静态页面通常由HTML、CSS 和 JavaScript…

荣誉榜再度添彩!热烈祝贺旭帆科技荣获安徽省大数据企业!

2023年11月3日&#xff0c;安徽省数据资源管理局网站发布《关于2023年度安徽省大数据企业名单的公示》&#xff0c;经企业申报、各市初审推荐、专家评审、审查认定等程序&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;凭借在视频大数据应用…

【Unity地编】地形系统搭建入门详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

系列十、堆参数调优

一、堆内存调优参数 -Xms堆空间的最小值&#xff0c;默认为物理内存的1/64-Xmx堆空间的最大值&#xff0c;默认为物理内存的1/4-XX:PrintGCDetails输出详细的GC处理日志 二、获取堆内存的默认物理内存 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 14:50* Description: 获…

在Linux上安装Oracle 数据库 11g

好久没碰11g了&#xff0c;今天&#xff08;2023年11月16日&#xff09;因为有个需求又装了一遍。 在OCI上安装了一个Oracle Linux 6实例&#xff1a; $ uname -a Linux instance-20231116-1239-db11g 4.1.12-124.80.1.el6uek.x86_64 #2 SMP Mon Oct 9 02:32:10 PDT 2023 x86…

ATE测试设备功能、原理、特点详解

ATE(Automatic Test Equipment)自动测试设备是用于检测电子产品、电气设备的自动化测试系统&#xff0c;是电测行业首选的一种测试方式&#xff0c;被广泛应用于通信、消费电子、汽车电子、智能家居、半导体、电源模块、医疗电子、航天航空等领域。ATE测试设备在电子设计、研发…

【自动化测试】基于Selenium + Python的web自动化框架!

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化工具&#xff0c;她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid&#xff1a;  1、Selenium IDE&…

网站使用什么协议比较好

网站协议大多数使用HTTP和HTTPS HTTP协议&#xff0c;超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议。 HTTP是应用层协议&#xff0c;同其他应用层协议一样&#xff0c;是为了实现某一类具体应用的协议&…