进阶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;}@Overridepublic 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;}@Overridepublic 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;}}//获取集合大小sizepublic 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;}}@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic void accept(String s) {System.out.println(s);}});*/}
}

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

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



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

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

相关文章

Python 测试框架 Pytest 的入门

简介 pytest 是一个功能强大而易于使用的 Python 测试框架。它提供了简单的语法和灵活的功能&#xff0c;用于编写和组织测试代码。 1、简单易用&#xff1a;pytest 的语法简洁明了&#xff0c;使得编写测试用例更加直观和易于理解。它使用 assert 语句来验证预期结果&#x…

Java—学生信息管理系统(简单、详细)

文章目录 一、主界面展示二、学生类三、系统功能方法3.1 main()方法3.2 添加学生信息3.3 删除学生信息3.4 修改学生信息3.5 查看所有学生信息 四、完整代码4.1 Student .Java4.2 StudentManger.Java 前言&#xff1a;本案例在实现时使用了Java语言中的ArrayList集合来储存数据。…

Gitee上传代码教程

1. 本地安装git 官网下载太慢&#xff0c;我们也可以使用淘宝镜像下载&#xff1a;CNPM Binaries Mirror 安装成功以后电脑会有Git Bush标识&#xff0c;空白处右键也可查看。 2. 注册gitee账号&#xff08;略&#xff09; 3. 创建远程仓库 4. 上传代码 4.1 在项目文件目录…

Linux的基本指令(四)

目录 前言 时间相关的指令 date指令 时间戳 日志 时间戳转化为具体的时间 cal指令 find指令&#xff08;十分重要&#xff09; grep指令&#xff08;行文本过滤工具&#xff09; 学前补充 什么是打包和压缩&#xff1f; 为什么要打包和压缩&#xff1f; 怎么打包和…

机器学习/sklearn笔记:MeanShift

1 算法介绍 一种基于质心的算法通过更新候选质心使其成为给定区域内点的均值候选质心的位置是通过一种称为“爬山”技术迭代调整的&#xff0c;该技术找到估计的概率密度的局部最大值 1.1 基本形式 给定d维空间的n个数据点集X&#xff0c;那么对于空间中的任意点x的均值漂移…

JAVA小游戏“简易版王者荣耀”

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…

微信怎么关闭免密支付?正确操作方法来了!

如今&#xff0c;微信已经深入到我们生活的方方面面。在享受其便利的同时&#xff0c;我们有时也会因为其提供的免密支付功能而产生焦虑和一些不必要的麻烦。 为了确保自己的支付安全&#xff0c;如果你不想继续使用这项功能&#xff0c;那么怎么关闭免密支付功能是你当前需要…

CSS新手入门笔记整理:CSS基本选择器

id属性 id属性具有唯一性&#xff0c;也就是说&#xff0c;在一个页面中相同的id只能出现一次。在不同的页面中&#xff0c;可以出现两个id相同的元素。 语法 <div id"text"> ...... </div> class属性 class&#xff0c;顾名思义&#xff0c;就是“类…

本地websocket服务端暴露至公网访问【cpolar内网穿透】

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

【C++入门到精通】C++入门 —— set multiset (STL)

阅读导航 前言一、set简介二、std::set1. std::set简介2. std::set的使用- 基本使用- std::set的模板参数列表- std::set的构造函数- std::set的迭代器- std::set容量与元素访问函数 3. set的所有函数&#xff08;表&#xff09; 三、std::multiset1. std::multiset简介 四、st…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境&#xff0c;可以参考文章&#xff1a; 详解如何使用VS code搭建JavaScript环境&#xff08;适合小白&#xff09;_vscode配置javascri…

[NOIP2006]明明的随机数

一、题目 登录—专业IT笔试面试备考平台_牛客网 二、代码 set去重&#xff0c;再利用vector进行排序 std::set是一个自带排序功能的容器&#xff0c;它已经按照一定的规则&#xff08;默认是元素的小于比较&#xff09;对元素进行了排序。因此&#xff0c;你不能直接对std::s…

Node.js与npm的准备与操作

1.下载 Node.js官网&#xff1a;Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下&#xff1a; LTS&#xff08;Long Term Support&#xff09;&#xff1a;长期支持版&#xff0c;稳定版 Current&am…

Vim 一下日志文件,Java 进程没了?

一次端口告警&#xff0c;发现 java 进程被异常杀掉&#xff0c;而根因竟然是因为在问题机器上 vim 查看了 nginx 日志。下面我将从时间维度详细回顾这次排查&#xff0c;希望读者在遇到相似问题时有些许启发。 时间线 15:19 收到端口异常 odin 告警。 状态:P1故障 名称:应用端…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库&#xff1f; 亮点&#xff1a;Tencent Cloud VectorDB支持Embedding&#xff0c;免去自己搭建模型的负担&#xff08;搭建一个生产环境的模型实在耗费精力和体力&#xff09;。 腾讯云向量数据库是什么&#xff1f; 腾…

【SwiftUI】7.预览及其内部机制

上一篇讲到了组件及组件化&#xff0c;从概念和优/缺点两个方向说明了组件化的意义&#xff0c;更为重要的是&#xff0c;组件和组件化是一个在编程领域&#xff0c;放之四海皆可以的概念&#xff0c;理解和运用它是非常必要的&#xff0c;希望大家能掌握。今天我们介绍另一个特…

卸载软件最最最彻底的工具——Uninstall Tool

卸载软件最最最彻底的工具——Uninstall Tool Uninstall Tool 是一款功能强大的专业卸载工具。针对一些普通卸载不彻底的问题&#xff0c;它可以做到最优&#xff0c;比如Matlab等软件的卸载难的问题也可以较好地解决。 它比 Windows 自带的“添加/删除程序”功能快 3 倍&…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHF 文章目录 GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHFPretraining 预训练阶段Supervised FineTuning &#xff08;SFT&#x…

ChatGLM2-6B微调过程说明文档

参考文档&#xff1a; ChatGLM2-6B 微调(初体验) - 知乎 环境配置 下载anaconda&#xff0c;版本是Anaconda3-2023.03-0-Linux-x86_64.sh&#xff0c;其对应的python版本是3.10&#xff0c;试过3.7和3.11版本的在运行时都报错。 执行下面的命令安装anaconda sh Anaconda3-202…

【自主探索】基于 frontier_exploration 的单个机器人自主探索建图

文章目录 一、概述1、功能2、要求 二、使用方法1、用于运行演示2、用于开发人员2.1. 探索无/地图数据2.2. 使用 /map 数据进行探索 三、提供的组件1、explore_client1.1. 调用的操作1.2. 订阅主题1.3. 发布主题 2、explore_server2.1. 提供的操作2.2. 调用的操作2.3. 调用的服务…