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

news/2024/5/11 23:20:51

✨个人主页: 不漫游-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.mrgr.cn/p/42606108

相关文章

【leetcode】快慢指针相关题目总结

141. 环形链表 判断链表是否有环&#xff1a;如果链表中存在环&#xff0c;则在链表上不断前进的指针会一直在环里绕圈子&#xff0c;且不能知道链表是否有环。使用快慢指针&#xff0c;当链表中存在环时&#xff0c;两个指针最终会在环中相遇。 /*** Definition for singly-…

MySQL/MariaDB 如何查看当前的用户

MySQL 的所有数据库用户信息是存储在 user 数据表中的。 可以在登录成功数据后运行 SQL&#xff1a; MariaDB [(none)]> select user,host from user;就可以查看到数据中的所有用户信息。 MariaDB [(none)]> select user,host from user; ERROR 1046 (3D000): No databa…

开源相机管理库Aravis例程学习(五)——camera-api

本文针对Aravis官方例程中的:03-camera-api做简单的讲解目录简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的:03-camera-api做简单的讲解。并介绍其中…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…

MySQL三大日志(binlog,redolog,undolog)详解

转发https://segmentfault.com/a/1190000041758784 一、MySQL日志 MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。 日志关系如下图:…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

macOS打开程序提示文件已损坏

macOS打开程序提示文件已损坏解决方案 因为macOS有一个校验机制,如果打开程序提示文件已损坏,你需要使用终端,输入codesign --force --deep --sign - "这里拖入程序" 如果遇到macOS已阻止XXXX程序打开,因为它来自未经验证的开发者,你需要进入设置,安全性和隐私…

QAnything 与 OpenCloudOS 联合打造操作系统 AI 问答解决方案

由网易有道开源的AI知识库问答平台QAnything 1.4.0版本正式发布,并集成到OpenCloudOS操作系统中,为OpenCloudOS用户提供了一键部署AI知识问答库的能力。导语:4 月 26 日,由网易有道开源的 AI 知识库问答平台 QAnything 发布 1.4.0 版本,并集成到 OpenCloudOS 操作系统中,…

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式&#xff08;Behavioral Pattern&#xff09;是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并…

揭秘JavaScript数据世界:一文通晓基本类型和引用类型的精髓!

在编程的世界里,数据是构建一切的基础。就像建筑师需要了解不同材料的强度和特性一样,程序员也必须熟悉各种数据类型。 今天,我们就来深入探讨JavaScript中的数据类型,看看它们如何塑造我们的代码世界。 一、JavaScript数据类型简介 数据类型是计算机语言的基础知识,数据类…

实时通讯技术 WebRTC 介绍

WebRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音对话或视频对话的技术。 历史 2010年5月&#xff0c;Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎&#xff0c;并改为名为“WebRTC”。WebRTC使用…

MUR1060D-ASEMI开关电源专用MUR1060D

MUR1060D-ASEMI开关电源专用MUR1060D编辑:ll MUR1060D-ASEMI开关电源专用MUR1060D 型号:MUR1060D 品牌:ASEMI 封装:TO-252 正向电流(IF):10A 反向电压(VRRM):600V 正向电压(VF):1.30V 工作温度:-55C~150C 恢复时间:35ns 芯片个数:1 引脚数量:4 芯片尺寸:86mi…

冰箱主控 32位MCU,多通道、高精度的AD采样配合温度传感器,实现冰箱各温室的精确控温;低功耗设计

概览 小华高性价比32位MCU&#xff0c;多通道、高精度的AD采样配合温度传感器&#xff0c;实现冰箱各温室的精确控温&#xff1b;低功耗设计&#xff0c;绿色低碳、节能环保&#xff1b;模块化设计&#xff0c;充分利用丰富的通讯接口&#xff0c;使主控板、显示板和驱动板灵活…

HNU-数据库系统-甘晴void学习感悟

前言 过程坎坷&#xff0c;终局满意。 感觉是学懂了知识&#xff0c;并且拿到了分数这样的学科。 【先把这个位置占下来&#xff0c;之后有时间再补充】 教材如下&#xff1a; 总领 有点忘记了&#xff0c;可参考当时记录的笔记&#xff1a; 数据库系统-甘晴void学习笔记-…

五•一颂|广州流辰信息致敬每一个辛勤的劳动者,祝大家五一快乐!

正值五一国际劳动节来临之际,广州流辰信息感恩这个伟大的时代,致敬每一个辛勤劳动的劳动者们,并向大家致以节日的问候与祝福,祝大家:阖家团圆、幸福安康、节日快乐!时光飞逝,一年一度的五一国际劳动节如期而至。在这个竞争激烈的社会中,拥有勤劳品质的人儿总会在适当的…

系统目录结构

名称 详情/bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令/boot 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件/dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的…

统计建模——模型——python为例

统计建模涵盖了众多数学模型和分析方法&#xff0c;这些模型和方法被广泛应用于数据分析、预测、推断、分类、聚类等任务中。下面列举了一些常见的统计建模方法及其具体应用方式&#xff1a; 目录 1.线性回归模型&#xff1a; ----python实现线性回归模型 -------使用NumPy…

企业架构管控的探索与实践

当前,传统的组织结构和信息系统已经难以满足企业的发展需求,众多企业面临着数字化转型战略落地难、信息孤岛、系统集成度低和互操作性低等问题,导致业务流程不畅、资源浪费和效率低下。 为此,企业需要一种能够全面描述和分析现状,并能对企业做出合理诊断和规划的方法。企业…

学习笔记448—“消失”5个月后,她回来了!

消失了5个月后,张雪终于有消息了, 去了广发基金。 昨天,广发基金官宣了这一消息。在广发基金,张雪管的是“广发价值回报”, 目前就管了这一只基金,昨天(3月15日)才开始管。 这只基金规模不大,A类、C类份额加在一起也就2.08亿元,约等于张雪离任前管理规模的1%。 不过以…

Go-Zero微服务快速入门和最佳实践(一)

前言 并发编程和分布式微服务是我们Gopher升职加薪的关键。 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发。 虽说好上手,但是想和别人拉开差距,提高自己的竞争力,搞懂分布式微服务和并发编程还是灰常重要的,这也是我今年更新…