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

✨个人主页: 不漫游-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.mzph.cn/web/4378.shtml

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

相关文章

【PyTorch 实战3:YOLOv5检测模型】10min揭秘 YOLOv5 检测网络架构、工作原理以及pytorch代码实现(附代码实现!)

YOLOv5简介 YOLOv5&#xff08;You Only Look Once, Version 5&#xff09;是一种先进的目标检测模型&#xff0c;是YOLO系列的最新版本&#xff0c;由Ultralytics公司开发。该模型利用深度学习技术&#xff0c;能够在图像或视频中实时准确地检测出多个对象的位置及其类别&…

鸿蒙内核源码分析(时钟任务篇)

时钟概念 时间是非常重要的概念&#xff0c;我们整个学生阶段有个东西很重要,就是校园铃声. 它控制着上课,下课,吃饭,睡觉的节奏.没有它学校的管理就乱套了,老师拖课想拖多久就多久,那可不行,下课铃声一响就是在告诉老师时间到了,该停止了让学生HAPPY去了. 操作系统也一样&…

LLM大语言模型(十三):ChatGLM3-6B兼容Langchain的Function Call的一步一步的详细转换过程记录

# LangChain&#xff1a;原始prompt System: Respond to the human as helpfully and accurately as possible. You have access to the following tools: Calculator: Useful for when you need to calculate math problems, args: {\calculation\: {\description\: \calcul…

自动化爬虫工具:you-get安装与使用

Windows下的安装命令&#xff1a; pip install you-get linux下的安装命令&#xff1a; pip3 install you-get 下载完成后&#xff0c;我们可以看到如下的警告&#xff0c;意思就是这个工具并未被添加到环境变量中&#xff0c;如果我们想在命令行中直接调用&#xff0c;需要…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单&#xff0c;我用的是vim-plug&#xff0c;网络上随便一搜应该就有很多教程&#xff0c;而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

2024年电子商务与大数据经济国际会议 (EBDE 2024)

2024年电子商务与大数据经济国际会议 (EBDE 2024) 2024 International Conference on E-commerce and Big Data Economy 【会议简介】 2024年电子商务与大数据经济国际会议即将在厦门召开。本次会议旨在汇聚全球电子商务与大数据经济领域的专家学者&#xff0c;共同探讨电子商务…

nacos-redis-springboot

新项目 准备工作 nacos 版本 2.0.3 redis 最终版本说明 springcloud-alibaba&#xff1a;2.2.7RELEASE springcloud&#xff1a;Hoxton.SR12 springboot&#xff1a;2.3.12.RELEASE Nacos&#xff1a;2.0.3 步骤 启动nacos和redis 准备nacos配置文件 server: port…

使用frp实现内网穿透教程

文章目录 简介frp 是什么&#xff1f;为什么选择 frp&#xff1f; 概念工作原理代理类型 内网穿透教程服务端安装和配置本地Windows&#xff08;客户端&#xff09;安装和配置本地Linux虚拟机&#xff08;客户端&#xff09;安装和配置使用 systemd 管理服务端注意事项 简介 f…

GPT学术优化推荐(gpt_academic )

GPT学术优化 (GPT Academic):支持一键润色、一键中英互译、一键代码解释、chat分析报告生成、PDF论文全文翻译功能、互联网信息聚合GPT等等 ChatGPT/GLM提供图形交互界面&#xff0c;特别优化论文阅读/润色/写作体验&#xff0c;模块化设计&#xff0c;支持自定义快捷按钮&…

在线培训考试系统在线考试功能注意事项

在线培训考试系统在线考试功能注意事项 考试前务必注意是否开启防切屏、摄像头监考等防作弊措施&#xff0c;系统一旦检测到触发了疑似作弊行为会立刻自动交卷&#xff0c;考试终止&#xff1b; 答题者准备好后&#xff0c;可点击“开始答题”按钮进入考试&#xff0c;注意考…

【Vue】如何创建一个Vue-cli程序

一、准备工作 1、下载Node.js 官网地址 https://nodejs.org/en 2、查看版本 cmd下通过node-v,查看版本号&#xff1b; cmd下通过npm-v,查看是否打印版本号。 3、安装淘宝加速器 npm install cnpm -g 4、安装Vue-cli cnpm install vue-cli -g 二、创建Vue程序 1、创建一个V…

Aurora-64B/10B、XDMA与DDR结合设计高速数据流通路设计/Aurora光纤设计/XDMA读取DDR设计/基于FPGA的高速数据传输设计

因最近想通过FPGA把数据从光纤传到PC&#xff0c;借此机会和大家一起学习Aurora、XDMA结合DDR 制作不易&#xff0c;记得三连哦&#xff0c;给我动力&#xff0c;持续更新&#xff01;&#xff01;&#xff01; 完整工程文件下载&#xff1a;XDMA读写DDR工程 提取码&…

微信小程序的常用API②

一、动画API &#xff08;1&#xff09;作用&#xff1a;用于在微信小程序中完成动画效果的制作 &#xff08;2&#xff09;使用&#xff1a;创建实例 wx.createAnimation() &#xff08;3&#xff09;常用属性&#xff1a; duration 【number型】 动画持续时间&…

《C++学习笔记---入门篇2》---传值引用与传引用返回详解

先看这个程序&#xff0c;随着Count栈帧的销毁&#xff0c;会创建一个临时变量将n的值带回&#xff0c;可以实现我们的目的。 再看这个情况的时候&#xff0c;对于n来说他存放的位置在静态区&#xff0c;他不会随着函数栈帧的销毁而销毁&#xff0c;返回的时候依旧靠着临时变量…

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量&#xff1f;path什么用&#xff1f; 系统设置之一&#xff0c;通过设置PATH&#xff0c;可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动&#xff0c;需要将该程序目录配置进PATH 1.3 PATH和我们的关系…

Python脚本抢票【笔记】

Python脚本抢票【笔记】 前言版权推荐Python脚本抢票【Python】microsoft edge驱动器下载以及使用最后 前言 2024-4-17 18:19:15 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…

容器工作流

背景 目前某平台使用计算容器和解析容器&#xff0c;这两种容器目前通过rabbitmq消息来进行链接&#xff0c;形成容器工作流&#xff0c;使用容器工作流框架可以省去两个容器中间环节的控制&#xff0c;不需要再使用java代码对容器的操作&#xff0c;通过容器工作流框架即可控…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后&#xff0c;本地仓库可以修改对应的remote。 之前谈过几种方法&#xff0c;比如重新设置一个新的remote的指针&#xff0c;绑定到新地址。然后删除origin&#xff0c;然后把新指针mv到origin。比如直接seturl修改&#xff08;git remote se…