【数据结构-字符串 五】【字符串转换】字符串转为整数

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

明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。

字符串转为整数【MID】

字符串和栈结合的一道题

题干

题目如下

一些用例的示例:

解题思路

原题解地址,在这里依据题意罗列几个要点:

  • 根据示例 1,需要去掉前导空格;
  • 根据示例 2,需要判断第 1 个字符为 + 和 - 的情况,因此,可以设计一个变量 sign,初始化的时候为 1,如果遇到 - ,将 sign 修正为 -1;
  • 判断是否是数字 ,可以使用字符的 ASCII 码数值进行比较,即 0 <= c <= '9';
  • 根据示例 3 ,在遇到第 1 个不是数字的字符的情况下,转换停止,退出循环;
  • 根据示例 5,如果转换以后的数字超过了 int 类型的范围,需要截取。这里不能将结果 res 变量设计为 long 类型,注意:由于输入的字符串转换以后也有可能超过 long 类型,因此需要在循环内部就判断是否越界,只要越界就退出循环,这样也可以减少不必要的计算 ;由于涉及下标访问,因此全程需要考虑数组下标是否越界的情况。

代码实现

给出代码实现基本档案

基本数据结构 :字符串
辅助数据结构 :无
算法 :迭代
技巧 :无

java 复制代码
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),借助的常量阶的空间

相关推荐
likexuec2 小时前
数据结构(2)
数据结构
D e re k ZH4 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶5 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
十二1 天前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
D e re k ZH1 天前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
careathers1 天前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛1 天前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
老师我太想进步了20262 天前
【数据结构-4】算法美学之顺序表
数据结构·算法
GrowingIO技术社区2 天前
CDP、行为分析、归因与营销自动化有什么区别?
数据结构·数据挖掘·数据分析
GrowingIO技术社区2 天前
实时标签怎样验收?从数据更新到分群可用
数据结构·数据挖掘·数据分析