力扣_字符串1—字符串转整数

题目

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 − 2 31 −2^{31} 231 的整数应该被固定为 − 2 31 −2^{31} 231 ,大于 2 31 − 1 2^{31} − 1 2311 的整数应该被固定为 2 31 − 1 2^{31} − 1 2311
返回整数作为最终结果。

思路

  • 难点—限幅
    • 返回值为 r e t ret ret,32位有符号整数范围为 [intMax, intMin],因此判断数字越界时,要始终保持 r e t ret ret 在 int 类型的取值范围内。
    • r e t ret ret 更新: r e t = r e t ∗ 10 + n u m ∗ s i g n ret = ret*10+num*sign ret=ret10+numsign
    • 超出范围的情况:
      • r e t ret ret 为正
        • r e t > i n t M a x / 10 ret > intMax/10 ret>intMax/10
        • r e t = = i n t M a x / 10 ret == intMax/10 ret==intMax/10 and n u m > i n t M a x num>intMax num>intMax mod 10 10 10
      • r e t ret ret 为负
        • r e t < i n t M i n / 10 ret < intMin/10 ret<intMin/10
        • r e t = = i n t M i n / 10 ret == intMin/10 ret==intMin/10 and − n u m < i n t M i n -num<intMin num<intMin mod 10 10 10

代码

class Solution {
   
public:
    int myAtoi(string s) {
   
        int n = s.size();
        stack<int> stk;
        int start = 0;
        int sign = 1;
        int ret = 0;
        for(int i = 0; i < n; i++){
   
            if(s[i] == ' ')
                start++;
            else
                break;
        }
        for(int i = start; i < n; i++){
   
            if(i==start && s[i] == '-'){
   
                sign = -1;
            }
            else if(i==start && s[i] == '+'){
   
                sign = 1;
            }
            else if(int(s[i]-'0')>=0 && int(s[i]-'0')<=9){
   
                if(sign==1 && ret > INT_MAX/10 || ret == INT_MAX/10&&int(s[i]-'0')>INT_MAX%10)
                    return INT_MAX;
                if(sign==-1 && ret < INT_MIN/10 || ret == INT_MIN/10&&-int(s[i]-'0')<INT_MIN%10)
                    return INT_MIN;
                ret = ret*10 + sign*int(s[i]-'0');
            }
            else{
   
                break;
            }
        }
        return ret;
    }
};

相关推荐

  1. _字符串1字符串整数

    2024-01-17 14:38:02       53 阅读
  2. 344-反字符串

    2024-01-17 14:38:02       52 阅读
  3. -344. 反字符串

    2024-01-17 14:38:02       44 阅读
  4. :541. 反字符串 II

    2024-01-17 14:38:02       31 阅读
  5. 第八题——字符串转换整数

    2024-01-17 14:38:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-17 14:38:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-17 14:38:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-17 14:38:02       87 阅读
  4. Python语言-面向对象

    2024-01-17 14:38:02       96 阅读

热门阅读

  1. 什么是设计模式(第7章笔记)

    2024-01-17 14:38:02       62 阅读
  2. 学习Vue的插槽总结

    2024-01-17 14:38:02       61 阅读
  3. Linux环境安装MySQL5.7教程

    2024-01-17 14:38:02       61 阅读
  4. 笨蛋学设计模式结构型模式-桥接模式【11】

    2024-01-17 14:38:02       48 阅读
  5. 软件工程宠物管理系统详细计划示例

    2024-01-17 14:38:02       46 阅读
  6. 为什么安卓逆向手机要root

    2024-01-17 14:38:02       56 阅读
  7. 安装 Git

    2024-01-17 14:38:02       50 阅读
  8. ChatGPT和文心一言哪个好用?

    2024-01-17 14:38:02       60 阅读
  9. 从0开始学前端第一天

    2024-01-17 14:38:02       42 阅读
  10. 前端生成CRC16

    2024-01-17 14:38:02       51 阅读
  11. 初识C++

    初识C++

    2024-01-17 14:38:02      44 阅读