leetcode-8. 字符串转换整数 (atoi)

简介: 我们可以把符号位和数字分开来,用ans来记录数字,每次读到一位数字将ans * 10,把当前读取到的数字转为int型,与ans相加(不理解的童鞋可以打一下草稿,写一下每次的过程)。

d40058c97be04f6ba7c86b065d2fce9f.png

d3df033fe8d449bdb75d83b593b3faf0.png


题目链接https://leetcode.cn/problems/string-to-integer-atoi/

思路


1.读入字符串并丢弃无用的前导空格


隐藏条件:在读取到第一个符号位或数字位前面只能出现空格否则无法转换。

我们取一个标识变量f记录前导空格,一直读取到第一个符号位或者是数字位,f才为1。


2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。


我们取一个符号位变量flag,来记录最后答案的正负。


3.读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。


这个很简单,因为前面我们取了一个标志位f了,当标志位f为1的情况下,读取到的不是数字,则跳出循环。


4.将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

我们可以把符号位和数字分开来,用ans来记录数字,每次读到一位数字将ans * 10,把当前读取到的数字转为int型,与ans相加(不理解的童鞋可以打一下草稿,写一下每次的过程)。


5.如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。


  • 符号位flag为-1的时候,判断是否ans > 231

1.是,则返回−231

2.否,则返回ans * flag


  • 符号位flag为1的时候,判断是否ans > 231 - 1

1.是,则返回231 - 1

2.否,则返回ans * flag


  • 隐藏条件: 如果在循环读取数字的时候,ans > 231就可以跳出循环了。


代码实现


func myAtoi(s string) int {
    //ans答案 flag符号位 f表示一直读到符号或者是数字才为1
    ans,flag, f := 0, 1, 0
    for i := range s{
      //读取数字
        if s[i] >= '0' && s[i] <= '9'{
            ans = ans * 10 + int(s[i] - '0')
            f = 1
            if ans >  1<<31{
                break
            }
        }else if s[i] == '-' && f == 0{
            flag = -1
            f = 1
        }else if s[i] == '+' && f == 0{
            f = 1
        }else if f == 1 || (f == 0 && s[i] != ' '){
            break
        }
    }
    if f == 1{
        if flag == -1 && ans > 1<<31{
            return -1 * (1<<31)
        }else if flag == 1 && ans > (1<<31) - 1{
            return (1<<31) - 1
        }
        return ans * flag
    }
    return 0
}

834d90091cea44a185252b4a1f4b397b.png

目录
相关文章
|
2月前
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
37 1
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
34 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
17 0
|
2月前
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
53 0
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
19 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
59 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
36 1