吾日三省吾身---对平常遇到的错误总结

2024-04-28 05:12

本文主要是介绍吾日三省吾身---对平常遇到的错误总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✨个人主页: 不漫游-CSDN博客

前言

本篇文章是对平常练习遇到的问题总结,多吸取经验教训才能避免未来再犯~

Java语法部分 

(一)多态

思考:这道题很明显考察的是多态的知识点,即一个对象可以被赋值给其父类的引用,这样可以通过父类的引用调用子类的方法。

读题就可以知道B是A的子类,C是B的子类,但同样也还是A的子类,记住这点答案就显而易见了,选的是D~

(二)继承

思考:这道题是关于继承的知识,在类 Alpha 中,继承了类 Base,在 main 方法中,由于 Alpha 是 Base 的子类,因此在创建 Alpha 对象时,会隐含super关键字

首先创建一个 Alpha 对象 ​new Alpha()​,此时会先执行 Base 类的构造方法,输出"Base",然后执行 Alpha 类的构造方法,但没有输出内容。
接着创建一个 Base 对象 ​new Base()​,此时只会执行 Base 类的构造方法,输出"Base"。

 所以最后结果就是输出BaseBase。

 (三)字符串的特性

思考: 这道题很容易出错,首先分析代码

1. 首先创建 Example 对象 ex,并初始化了字符串 str 和字符数组 ch。

2. 在 change 方法内部将 str 修改为"test ok",但是这种修改只作用于方法内部,并不会影响到原始对象 ex.str 的值,因为Java中字符串属于不可变对象,所以修改后会在 change 方法结束后被丢弃。


3. 另一方面,修改了字符数组 ch 的第一个元素为 'g',这种修改会影响到原始对象 ex.ch 的内容,因为字符数组是可变对象。所以最终输出是 "good and gbc"。

编程题 

(一)字符集合

字符集合_牛客题霸_牛客网输入一个字符串,求出该字符串包含的字符集合,按照字母输入的顺序输出。 数据范。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/784efd40ed8e465a84821c8f3970b7b5?tpId=182&tqId=34772&ru=/exam/oj

思考:这道题仔细看题不难发现就是要去重即可,既如此,那便可以记录字母出现的次数,如果出现次数是0次,那就是新字母,那就存起来。

可是这道题很容易忽略字符串String的特性-->不可修改性

因此这里就要创建一个可变字符串类型对象才可以实现,画图理解就更好

代码实现就是这样了: 因为要区分大小写,所以创建的是128长的字符数组,最大的ASCII 值

import java.util.Scanner;public class Main {public static String func(String s) {int ret = 0;// 创建一个长度为128的字符数组,用于记录每个字符是否出现过char[] arr = new char[128];// 创建一个可变字符串对象,用于存储处理后的字符StringBuilder str = new StringBuilder();for (int i = 0; i < s.length(); i++) {// 如果字符在数组中对应位置值为0,表示该字符尚未出现过if (arr[s.charAt(i)] == 0) {str.append(s.charAt(i));//追加字符// 将字符在数组中对应位置标记为已出现arr[s.charAt(i)]++;}}// 将可变字符串转换为不可变字符串并返回return str.toString();}public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) {System.out.println(func(in.nextLine()));}}
}

(二)合并两个有序数组

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/merge-sorted-array/description/

思考:这道题要思考怎么合并,合并后怎么排序。当然这是直观思路,

但仔细观察,num1和num2本身就是有序的,并且num1的数组长度是m+n,

这样一来,可以利用两个指针分别指向两个数组的末尾,然后从后向前遍历两个数组,比较它们的元素大小,并将较大的元素放入合并后的数组的末尾。 

搭配动图就更好理解了~ 

代码实现便是下面: 

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m - 1; //指向nums1数组的末尾int p2 = n - 1; //指向nums2数组的末尾int p = m + n - 1; //指向合并后数组的末尾// 从后向前遍历两个数组,将较大的元素放入合并后数组的末尾while (p2 >= 0) {//如果nums1数组的元素较大,将其放入合并后数组的末尾if (p1 >= 0 && nums1[p1] > nums2[p2]) {nums1[p] = nums1[p1];p1--;} else {//num2数组同理nums1[p] = nums2[p2];p2--;}p--; //更新合并后数组的指针位置}}
}

数据结构部分

(一)链表

思考:选C

这道题没有考虑周到,一般情况下,在不带头结点的单链表存储队列中,进行出队操作时,要移除队头元素,因此需要修改队头指针。

但如果移除后队列为空,则需要同时修改队尾指针为空。因此,在进行出队操作时,队头队尾指针都可能需要被修改。

(二)堆排序

 

思考:要注意是 排升序要建大堆,排降序建小堆,别记混了~选C

(三)子序列问题

判断子序列_牛客题霸_牛客网给定两个字符串 S 和 T ,判断 S 是否是 T 的子序列。 即是否可以从 T 删。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/39be6c2d0a9b4c30a7b04053d5960a84?tpId=117&tqId=39453&ru=/exam/oj

思考:这道题是匹配类型的问题,用栈是比较适合的,可以先将字符串S入栈,在遍历T的过程中与栈顶元素比较,如果相同则出栈,最后倘若栈空,则就是子序列了

import java.util.*;public class Solution {/**** S字符先后顺序和T中一致** @param S string字符串* @param T string字符串* @return bool布尔型*/public boolean isSubsequence (String S, String T) {if (S.equals(T)) {return true;}Stack<Character> stack = new Stack<>();for (int i = S.length() - 1; i >= 0; i--) {stack.push(S.charAt(i));}for (int i = 0; i < T.length(); i++) {if (stack.isEmpty()) {return true; //如果栈为空,说明S已经全部匹配完成,即S是T的子序列}if (stack.peek() == T.charAt(i)) {stack.pop();}}return stack.isEmpty(); //判断最后栈是否为空,如果为空则S是T的子序列,否则不是}
}

(四)点击消除问题

点击消除_牛客题霸_牛客网牛牛拿到了一个字符串。 他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串icon-default.png?t=N7T8https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId=308&tqId=40462&ru=/exam/oj

思考:这道题用栈去写会比较适合,思路和判断子序列大差不差,但要注意

最后输出的是正序,但用栈最后输出的是逆序,所以在遍历字符串的时候可以从后遍历更加方便

画图理解

import java.util.Scanner;
import java.util.Stack;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) { String s = in.next(); //获取输入的字符串Stack<Character> stack = new Stack<>(); // 遍历输入的字符串for (int i = 0; i < s.length(); i++) {char c = s.charAt(i); //获取当前字符if (stack.isEmpty()) { stack.push(c); //入栈} else if (stack.peek() == c) { //如果当前字符与栈顶字符相同stack.pop(); //移除栈顶字符} else { stack.push(c);}}if (stack.isEmpty()) { //如果栈为空System.out.print(0); //输出0,表示所有字符都成对出现} else {// 遍历栈中剩余的字符并输出for (int i = 0; i < stack.size(); i++) {System.out.print(stack.get(i));}}}}
}

其实这些题目难度不算很大,但错了就是错了,还是要多总结,多复习才是,尤其是字符串相关的知识在OJ题中相当常见,所以还是要熟练掌握才行~

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

这篇关于吾日三省吾身---对平常遇到的错误总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942392

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns