【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。
字符串转为整数【MID】
字符串和栈结合的一道题
题干
题目如下

一些用例的示例:

解题思路
原题解地址,在这里依据题意罗列几个要点:
- 根据示例 1,需要去掉前导空格;
- 根据示例 2,需要判断第 1 个字符为 + 和 - 的情况,因此,可以设计一个变量 sign,初始化的时候为 1,如果遇到 - ,将 sign 修正为 -1;
- 判断是否是数字,可以使用字符的 ASCII 码数值进行比较,即
0 <= c <= '9'; - 根据示例 3 ,在遇到第 1 个不是数字的字符的情况下,转换停止,退出循环;
- 根据示例 5,如果转换以后的数字超过了 int 类型的范围,需要截取。这里不能将结果 res 变量设计为 long 类型,注意:由于输入的字符串转换以后也有可能超过 long 类型,因此需要在循环内部就判断是否越界,只要越界就退出循环,这样也可以减少不必要的计算;由于涉及下标访问,因此全程需要考虑数组下标是否越界的情况。
代码实现
给出代码实现基本档案
基本数据结构:字符串
辅助数据结构:无
算法:迭代
技巧:无
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param n int整型 the n* @return int整型*/public int myAtoi(String s) {// 1 初始化下标,并删除下标前的空格int index = 0;while (index < s.length() && s.charAt(index) == ' ') {index++;}// 极端情况下,字符串全为空格,此时返回0if (index == s.length()) {return 0;}// 2 判断第一个非空格字符的符号,获取整数的符号,无论正负,均继续向前探索int sign = 1;if (s.charAt(index) == '-') {sign = -1;index++;} else if (s.charAt(index) == '+') {index++;}// 3 循环判断,进行数字读取int result = 0;while (index < s.length()) {// 3-1 如果为非数字,则终止if (s.charAt(index) < '0' || s.charAt(index) > '9') {break;}// 3-2 如果为数字则需要判断增加数字后是否会溢出int curNum = s.charAt(index) - '0';// 如果当前值*10后大于上届,或当前值*10等于上届但本级数字大于上届的取模,则证明本层遍历完还是大于上届if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && Integer.MAX_VALUE % 10 < curNum)) {return sign > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}// 3-3 如果未越界则正常存值,每次新读入值后上一个结果就要扩大10倍result = result * 10 + curNum;index++;}return sign * result;}}
复杂度分析
时间复杂度 O(N),一次遍历 s;
空间复杂度 O(1),借助的常量阶的空间
比较版本号【MID】
还是字符串识别的一道题,比较版本号

题干
题目如下

解题思路
原题解地址,比较两个版本号大小,版本号由修订号组成,中间使用’.'分隔,越靠近字符串前边,修订号的优先级越大。当v1 > v2时返回 1,当v1 < v2时返回 -1,相等时返回 0

如样例所示,v1= 1.02.3, v2 = 1.02.2,前两个修订号都相等,v1的第三个修订号大于v2的第三个修订号,因此v1 > v2,返回1。下面来讲解双指针的做法。
我们使用两个指针i和j分别指向两个字符串的开头,然后向后遍历,当遇到小数点’.‘时停下来,并将每个小数点’.'分隔开的修订号解析成数字进行比较,越靠近前边,修订号的优先级越大。根据修订号大小关系,返回相应的数值
// 将一段连续的字符串转换成数字
while(i < v1.size() && v1[i] != '.') {num1 = num1 * 10 + v1[i++] - '0';
}
这样做可以直接去前导0,同时将字符串转换成数字也便于比较大小。具体过程如下:
- 定义两个指针 i和j,初始化
i = 0,j = 0。 - 两个指针分别遍历两个字符串,将每个小数点
'.'分隔开的修订号解析成数字,并进行大小比较:
* 如果num1 > num2,返回 1;
* 如果num1 < num2,返回 -1;
3、i++,j++,两个指针都后移一步,进行下一轮的修订号解析比较。
4、如果遍历完两个字符串都没有返回相应结果,说明两个字符串相等,返回0。
时间复杂度分析: 两个字符串各遍历一遍,因此时间复杂度为 O(n+m)O(n + m)O(n+m) ,n和m分别是两个字符串的长度。
代码实现
给出代码实现基本档案
基本数据结构:字符串
辅助数据结构:无
算法:迭代
技巧:双指针
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 比较版本号* @param version1 string字符串* @param version2 string字符串* @return int整型*/public int compare (String version1, String version2) {// 1 定义两个指针,分别漫游两个字符串int i = 0;int j = 0;// 2 双重漫游,遇到.的时候比较while (i < version1.length() || j < version2.length()) {// 2-1 没有遇到.号前获取修订号值int num1 = 0;int num2 = 0;while (i < version1.length() && version1.charAt(i) != '.') {num1 = num1 * 10 + version1.charAt(i) - '0';i++;}while (j < version2.length() && version2.charAt(j) != '.') {num2 = num2 * 10 + version2.charAt(j) - '0';j++;}// 2-2 获取到完整的一格修订号后比较if (num1 > num2) {return 1;} else if (num1 < num2) {return -1;}// 2-3 相等修订号情况下,继续向前i++;j++;}// 3 漫游完全部修订分区后,还是没有返回,证明两个版本号相同return 0;}
}
复杂度分析
时间复杂度 O(N+M),双指针,遍历两个字符串;
空间复杂度 O(1),借助的常量阶的空间
拓展知识:Integer.MAX_VALUE 和Integer.MIN_VALUE
Integer.MAX_VALUE 和 Integer.MIN_VALUE 是 Java 中的两个常量,它们分别代表了 int 数据类型的最大值和最小值。这两个常量定义在 Java 的 Integer 类中,是 int 数据类型的包装类。
-
Integer.MAX_VALUE:这个常量表示了int数据类型的最大可能值,即2^31 - 1,也就是2,147,483,647。当你试图存储一个比Integer.MAX_VALUE大的值时,会导致溢出。 -
Integer.MIN_VALUE:这个常量表示了int数据类型的最小可能值,即-2^31,也就是-2,147,483,648。当你试图存储一个比Integer.MIN_VALUE更小的值时,同样也会导致溢出。
这些常量通常用于限制或检查 int 类型的变量,以确保它们不会超出范围。这对于处理整数数据非常重要,因为溢出可能导致不正确的计算结果或未定义的行为。
相关文章:
【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...
React 组件传 children 的各种方案
自定义组件的时候往往需要传 children,由于写法比较多样,我就总结了一下。 方案列表 1. 类组件1.1 类组件,不使用解构1.2 类组件,使用解构 2. 函数组件2.1 函数组件,不使用解构2.2 函数组件,外部解构2.3 函…...
如何在一个传统的html中,引入vueJs并使用vue复制组件?
如何在一个传统的html中,引入vueJs并使用vue复制组件? 1.1 引言1.2 背景1.3 解决方案1.3.1 解决方案一:直接使用clipboard(不推荐仅供参考学习)1.3.2 解决方案二:封装指令js库后使用 (推荐) 1.1 引言 这篇博文主要分享如何在一个…...
【轻松玩转MacOS】故障排除篇
引言 在使用 MacOS 时,遇到故障是在所难免的。不要担心,这篇文章将为您提供一些常见的故障排除步骤,并介绍如何联系苹果的支持团队寻求帮助。让我们一起来看看吧! 一、常见的故障排除步骤 1.1 网络连接问题 如果你发现你的Mac…...
Linux基本指令(1)
Linux基本指令(1) 1.ls指令1.1ls的用法 2. pwd指令3.cd指令3.1 cd3.2补充内容3.3 cd - 指令3.4 cd ~ 指令 4. touch指令4.1stat指令 5.mkdir 指令6.rmdir/rm指令6.1补充内容 7.man指令8.nano 指令9.cat指令10 cp指令11 mv指令12 echo指令12.1 > 输出重…...
计算机毕业设计选题推荐-springboot 网上手机销售系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...
2、vscode c++ 项目配置调试及运行
文章目录 1、项目布局2、多项目管理2.1 先是一个总的CMakeLists.txt2.2 每个项目2.3 多版本OPENCV 3、调试和运行 接上一篇文章,vscode和cmake的c环境配置好以后,我们要写项目,再写对应的CMakeLists.txt 1、项目布局 . ├── bin ├── bu…...
二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先-力扣 235 题 求二叉搜索树最近公共祖先(祖先也包括自己) 前提: 1.节点值唯一 2.p和q都存在 要点:若 p,q 在 ancestor 的两侧,则 ancestor 就是它们的最近公共祖先 解题思路&…...
LuatOS-SOC接口文档(air780E)-- i2c - I2C操作
常量 常量 类型 解释 i2c.FAST number 高速 i2c.SLOW number 低速 i2c.exist(id) i2c编号是否存在 参数 传入值类型 解释 int 设备id, 例如i2c1的id为1, i2c2的id为2 返回值 返回值类型 解释 bool 存在就返回true,否则返回false 例子 -- 检查i2c1是否存…...
帝国cms改目录后打不开,帝国cms改目录生成后还是404
帝国CMS更改了网站域名或者栏目目录地址信息打不开的解决方法,一起来看看吧: 很多的小伙伴们,改了后台的系统设置里面的网站地址或者栏目目录地址,信息页就打不开的解决方法如下: 后台>系统>数据更新>更新信…...
计算机毕业设计选什么题目好?springboot智慧养老中心管理系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...
创建一个基本的win32窗口
1.建立一个窗口的基本步骤 (1)向系统注册一个窗体类 (2)根据窗体类创建窗口 (3)进入消息循环 2.程序结构 (1)主函数的输入参数 int WINAPI WinMain( HISTANCE hInstance,//当前窗口的句柄 HINSTANCE hPr…...
如何在 Spring Boot 中使用 WebSocket
在Spring Boot中使用WebSocket构建实时应用 WebSocket是一种用于实现双向通信的网络协议,它非常适合构建实时应用程序,如在线聊天、实时通知和多人协作工具。Spring Boot提供了对WebSocket的支持,使得在应用程序中集成WebSocket变得非常容易…...
ubuntu2023装完显卡驱动和CUDA CUDNN开机只有下划线闪烁
解决方法 网上很多方案,如Ubuntu开机后卡死只有左上角有一个下划线不停闪烁_ubuntu开机左上角横杠一直闪-CSDN博客,原因是显卡驱动和系统内核不兼容,解决方案是CtrlAltF2打开tty模式进行问题检查 但是我CtrlAltF2完全没反应。 于是…...
MySQL三种安装方法(yum安装、编译安装、二进制安装)
mysql安装 一、yum安装方式二、编译安装方式三、二进制安装方式 切记:一定要关闭防火墙和selinux!!! 服务器配置:2C4G即可,一台 一、yum安装方式 mysql的官方网站:www.mysql.com 中文官网&…...
《视觉 SLAM 十四讲》第 7 讲 视觉里程计1 【如何根据图像 估计 相机运动】【特征点法】
github源码链接V2 文章目录 第 7 讲 视觉里程计17.1 特征点法7.1.1 特征点7.1.2 ORB 特征FAST 关键点 ⟹ \Longrightarrow ⟹ Oriented FASTBRIEF 描述子 7.1.3 特征匹配 7.2 实践 【Code】本讲 CMakeLists.txt 7.2.1 使用 OpenCV 进行 ORB 的特征匹配 【Code】7.2.2 手写 O…...
9. 一个SpringBoot项目运行
新手如何运行一个SpringBoot项目 1.SpringBoot项目运行 新创建的SpringBoot项目如何运行 2.启动lombok注解 点击该按钮,启动lombok注解支持 3.展示说明...
如何实现chatGPT批量问答,不用token
一、背景 因为需要批量提取一本教材里的概念做成知识图谱,想用chatGPT做概念提取。 调用api?别想了… 免费帐户的api慢得一批于是想用模仿人类交互的方法来调用,本来想用pyautogui的,但是主要是与浏览器交互,还是用s…...
Arduino驱动LIS2DH三轴加速度传感器(惯性测量传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 LIS2DH加速度计相对传统的ADXL345在稳定性以及功耗上都有一定的优化,低功耗模式下仅为2μA(普通模式11μA),并且最高支持5.3KHz输出频率,拥有2g/4g/8g/16g四档可选量程&...
B 开组会(可持久线段树+树剖) 武汉大学2023年新生程序设计竞赛(同步赛)
其实题目就是每次询问一个节点 在这个节点的基础上往下继续遍历t的深度,在这个遍历的过程中找一个最大值就行了 其实这个题目数据非常水,直接暴力就可以过了 下面是别人过的代码 #include<bits/stdc.h> using namespace std; const int mxn5e…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
