【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号

news2024/11/18 18:25:41

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇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++;
        }
        // 极端情况下,字符串全为空格,此时返回0
        if (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,同时将字符串转换成数字也便于比较大小。具体过程如下:

  1. 定义两个指针 i和j,初始化i = 0,j = 0
  2. 两个指针分别遍历两个字符串,将每个小数点'.'分隔开的修订号解析成数字,并进行大小比较:
    * 如果 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_VALUEInteger.MIN_VALUE 是 Java 中的两个常量,它们分别代表了 int 数据类型的最大值和最小值。这两个常量定义在 Java 的 Integer 类中,是 int 数据类型的包装类。

  1. Integer.MAX_VALUE:这个常量表示了 int 数据类型的最大可能值,即 2^31 - 1,也就是 2,147,483,647。当你试图存储一个比 Integer.MAX_VALUE 大的值时,会导致溢出。

  2. Integer.MIN_VALUE:这个常量表示了 int 数据类型的最小可能值,即 -2^31,也就是 -2,147,483,648。当你试图存储一个比 Integer.MIN_VALUE 更小的值时,同样也会导致溢出。

这些常量通常用于限制或检查 int 类型的变量,以确保它们不会超出范围。这对于处理整数数据非常重要,因为溢出可能导致不正确的计算结果或未定义的行为。

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

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

相关文章

Andriod学习笔记(一)

写在前面的话 App开发的编程语言Java和KotlinXML App连接的数据库App工程目录结构模块级别的编译配置文件清单文件 界面显示与逻辑处理 安卓是一种基于Linux内核的自由及开放源代码的操作系统&#xff0c;主要使用于移动设备。 Mininum SDK表示安卓该版本以上的设备都可以运行该…

Vue计算属性的使用

当我们想要通过data中运算得到一个新的数据时&#xff0c;我们就可以使用计算属性。比如&#xff1a;data里的单价price和数量number可以相乘计算总价sum&#xff0c;这个sum我们就称为计算属性。 计算属性的语法格式&#xff1a; computed:{ 计算属性名称 ( ) { return 计算…

LAS Spark 在 TPC-DS 的优化揭秘

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 文章主要介绍了火山引擎湖仓一体分析服务 LAS Spark&#xff08;下文以 LAS Spark 指代&#xff09;在 TPC-DS 上的性能突破与优化策略。TPC-DS 是一个模拟复杂数据…

4、在 CentOS 8 系统上安装 pgAdmin 4

pgAdmin 4 是一个开源的数据库管理工具&#xff0c;专门用于管理和操作 PostgreSQL 数据库系统。它提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;使用户能够轻松地连接到 PostgreSQL 数据库实例&#xff0c;执行 SQL 查询&#xff0c;管理数据库对象&#xf…

网络拓扑自动扫描工具

topology-scanner Topology-Scanner是WeOps团队免费开放的一个网络拓扑自动扫描模块&#xff0c;可以自动发现网络设备的类型、网络设备之间的互联 使用方式 java -jar ./topology-scanner.jar --config_path./config/ 配置说明 1. 拓扑发现请求参数文件(request.json) i…

Web3 新手攻略:9 个不可或缺的 APP 助力你踏入加密领域

Web3世界充满了无限机遇&#xff0c;但要掌握它&#xff0c;您需要合适的工具&#xfffd;&#xfffd;&#xfffd;。今天&#xff0c;我将为您介绍9款Web3必备APP&#xff0c;涵盖钱包、DEX、和工具三大类别。而且&#xff0c;我要特别强烈推荐一个强大的钱包——Bitget Wall…

基于java+vue+springboot的家庭理财记账信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 项目介绍 在这科技…

Bitxhub跨链平台

BitXHub跨链平台 跨链系统架构 过程 在跨链合约中调用统一写好的Broker合约Broker合约抛出事件由Plugin捕获到封装成平台统一的数据结构提交到中继链中目的链的跨链网关从中继链中同步IBTP数据结构网关将该数据结构通过Plugin提交到目的链 中继链体系架构 中继链的模块和流程…

【Vue面试题十七】、你知道vue中key的原理吗?说说你对它的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;你知道vue中key的原理吗…

10.本项目的简单介绍及所用工具

本项目的简单介绍及所用工具 本项目的层次架构适合初学者或者有一些基础的同学&#xff0c;项目整体简单明了&#xff0c;有着非常严谨的逻辑思维&#xff0c;并且在前面文章中也讲了一些项目中所需要的软件安装配置以及一些前置的在本项目中所需要的java基础知识。 项目名称 …

TCPUDP

TCP 1.什么是TCP TCP是处于运输层的通信协议&#xff0c;该协议能够实现数据的可靠性传输。 2.TCP报文格式 源端口和目的端口&#xff1a;各占两个字节&#xff0c;发送进程的端口和接收进程的端口号。 序号&#xff1a;占4个字节,序号如果增加到溢出&#xff0c;则下一个序…

几种预训练模型微调方法和peft包的使用介绍

文章目录 微调方法Lora(在旁边添加训练参数)Adapter&#xff08;在前面添加训练参数&#xff09;Prefix-tuning&#xff08;在中间添加训练参数&#xff09;Prompt tuning PEFTPEFT 使用PeftConfigPeftModel保存和加载模型 微调方法 现流行的微调方法有&#xff1a;Lora,promp…

【MySql】5- 实践篇(三)

文章目录 1. 日志和索引问题1. 日志相关问题1.1 两阶段提交 2. 业务设计相关问题 2. order by工作原理2.1 全字段排序2.2 rowid 排序2.3 全字段排序 VS rowid 排序 3. 正确显示随机消息3.1 内存临时表3.2 磁盘临时表3.3 随机排序方法 1. 日志和索引问题 1. 日志相关问题 1.1 …

NodeJs内置模块child_process

内置模块child_process子进程 写在前面 子进程是Nodejs的核心Api&#xff0c;如果你会shell命令&#xff0c;它会有非常大的帮助&#xff0c;或者你喜欢编写前端工程化工具之类&#xff0c;它也有很大的用处&#xff0c;以及处理CPU密集型应用。 创建子进程 Nodejs创建子进…

如何处理用户输入验证和表单提交?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…

Unity可视化Shader工具ASE介绍——5、ASE快捷键和常用节点介绍

大家好&#xff0c;我是阿赵。   继续介绍Unity可视化Shader插件ASE。这次来说一些常用节点的快捷键&#xff0c;顺便介绍一些常用的节点。   用过UE引擎的朋友可能会发现&#xff0c;ASE的整体用法和UE的材质节点编辑器非常的像&#xff0c;甚至连很多节点的快捷键都和UE的…

【Vue面试题十六】、Vue.observable你有了解过吗?说说看

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue.observable你有了解…

Python笔记;库,包,模块

在Python中库没有官方说法。 是其他地方沿用过来的。 姑且认为他是一个包或多个包的集合。 包里有子包和模块。 模块以.py格式存储。 下图是一个例子&#xff0c;对于Robot包&#xff1a; import math a math.sqrt(9) 等价于 from math import * a sqrt(9) from math im…

【数据库——MySQL(实战项目1)】(2)图书借阅系统——数据库测试、视图以及存储过程

目录 1. 简述2. 数据表 增、删、改 测试2.1 借阅人表2.2 图书表2.3 借阅信息表 3. 功能代码3.1 创建视图显示所有逾期未归还的借阅信息&#xff08;包括借阅人姓名&#xff0c;借阅人类别&#xff0c;书名&#xff0c;借出日期&#xff0c;应归还日期&#xff0c;逾期时长&…