首页 > 其他分享 >LeetCode 8. 字符串转换整数 (atoi)

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

时间:2025-01-23 10:42:18浏览次数:1  
标签:index 10 int res VALUE atoi 字符串 Integer LeetCode

题目

原题链接:LeetCode 8. 字符串转换整数 (atoi)

思路

题目首先要判断空格。将前面的空格先一个个扣除。扣完空格记得判断是否到达字符串末尾。
然后判断符号。用一个int存符号,正数为1,负数为-1。
接下来题目又说前置零又说非数字字符又说数字,理一下思路,其实就是判断是否是数字,是数字就进行转换。
转换数字仍然用 r = r * 10 + x,x从数字首位开始,就算有前置0也没关系。
因为题目可能要求不超过int范围,这里自己写不用long long存。用int,当然就要判断int范围了。
y总题解,中没有带着正负号去判断,他假设res一直为正,最后加上符号,那么以res为正的前提下去判断有没有超出负数范围就需要特判了,因为[-2147483648,2147483647],正负两个最大值最小值的绝对值是不一样的,最好是带着符合去判断,这样不需特判。

需要注意要将res * 10 + x > Integer.MAX_VALUE的判断转化成res > (Integer.MAX_VALUE - x) / 10,否则计算过程会超出int范围。

需要注意 x = s.charAt(index) - '0'需要先提前算出来,否则(Integer.MAX_VALUE - x)(Integer.MIN_VALUE - x)可能超出int范围。比如int最大是10,如果6 + 4计算过程中不会超,而6 + 6 - 2 + 4过程中就会超出范围。

代码

class Solution {
    public int myAtoi(String s)
    {
        // 先处理空格
        int index = 0;
        while(index < s.length() && s.charAt(index) == ' ') index ++;
        if (index == s.length()) return 0;
        // 判断正负号
        int fuhao = 1;
        if (s.charAt(index) == '+') index ++;
        else if (s.charAt(index) == '-')
        {
            fuhao = -1;
            index ++;
        }
        // 开始循环持续判断是否为数字
        int res = 0;
        while (index < s.length() && s.charAt(index) >= '0' && s.charAt(index) <= '9')
        {
            // 如果为数字,就分正负开始累加
            // 先将x拿出来防止超int范围
            int x = s.charAt(index) - '0';
            if (fuhao == 1) {
                if (res > (Integer.MAX_VALUE - x) / 10) return Integer.MAX_VALUE;
                res = res * 10 + x;
            } else {
                x = fuhao * x;
                if (res < (Integer.MIN_VALUE - x) / 10) return Integer.MIN_VALUE;
                res = res * 10 + x;
            }
            index ++;
        }
        return res;
    }
}

标签:index,10,int,res,VALUE,atoi,字符串,Integer,LeetCode
From: https://www.cnblogs.com/rdisheng/p/18687275

相关文章

  • python生成随机字符串
    在Python中,可以使用random、secrets或uuid模块来生成随机字符串。以下是几种常见的方法:1.使用random生成随机字符串importrandomimportstringdefgenerate_random_string(length=10):characters=string.ascii_letters+string.digits#包含大小......
  • A - 字符串的展开
    001.字符串的展开原题链接:字符串的展开纯模拟题AC代码:#include<bits/stdc++.h>#definelllonglong#defineendl'\n'usingnamespacestd;stringstr;voidextend(chara,charb,intp1,intp2,intp3){ //确定起点终点,填充字符类型,填充次数,填充顺序 intn=......
  • LeetCode 7. 整数反转
    原题链接:LeetCode7.整数反转思路方法1:数学方法使用数学方法。扣出数字的每一位,使用r=r*10+x%10公式将数字反转,判断是否溢出。判断溢出时可以安全判断,比如x为正数时,将r*10+x%10>Integer.MAX_VALUE转化成r>(Integer.MAX_VALUE-x%10)/10判断,不会在判......
  • 【LeetCode 刷题】栈与队列-基础操作
    此博客为《代码随想录》字符串章节的学习笔记,主要内容为栈与队列基础操作相关的题目解析。文章目录232.用栈实现队列225.用队列实现栈232.用栈实现队列题目链接classMyQueue:def__init__(self):self.in_s,self.out_s=[],[]......
  • String字符串定义、用法及不可变性
    文章目录前言一、String是什么?二、使用方法1.定义字符串代码如下(示例):2.定义字符串数组代码如下(示例):三、不可变性代码如下(示例):总结前言大家在学习Java语言时,String字符串类是一块不能缺失的学习内容,所以String是什么?该怎么用?以及它为什么是不可变的?接下来......
  • 数据结构与算法之递归: LeetCode 39. 组合总和 (Ts版)
    组合总和https://leetcode.cn/problems/combination-sum/description/描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合candid......
  • 字符串哈希详解
    哈希函数的选取通常我们采用的是多项式Hash的方法,对于一个长度为l的字符串s来说,我们可以这样定义多项式Hash函数:其中,M需要选择一个素数(至少要比最大的字符要大),b是一个比最大字符大的整数。(ASCII码值比较)之所以选择这样的哈希函数,不仅是因为它不容易产生哈希碰撞(就......
  • TIA SCL编程清除字符串中所有的空格
    今天做一个小的练习,这是2025年第一个记录的学习笔记。在IA新建一个FC,名字叫做TrimSpace,建立以下内部变量: 写一段SCL代码:#len:=LEN(#str_in);#str_trim_out:='';FOR#i:=1TO#lenDOIFMID(IN:=#str_in,L:=1,P:=#i)<>''THEN#str_t......
  • 【leetcode 22】541. 反转字符串II
    思路:其实在遍历字符串的过程中,只要让i+=(2*k),i每次移动2*k就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2*k区间的起点,这样写,程序会高效很多。classSolution{publicStringreverseStr(Strings,intk){char[]ch=s.toCh......
  • leetcode349-两个数组的交集
    leetcode349实现利用哈希set进行去重,然后循环nums2,如果nums2中的元素是在去重后的num1中出现过的,就存放在set2中,因为最后要返回的是不重复的数组,所以先放在set2,让其进行去重,最后把set2转为数组方法1varintersection=function(nums1,nums2){constset1=[........