首页 > 其他分享 >力扣刷题笔记-08 字符串转整数

力扣刷题笔记-08 字符串转整数

时间:2023-10-08 15:47:02浏览次数:40  
标签:temp res 08 VALUE 力扣 startIndex 正负号 Integer 刷题

08 字符串转整数

属于对字符串进行操作的问题

百无一用是情深

问题

字符串里有数字,空格,正负号等,需要先过滤出来

在这道题目里,我们通常考虑字符串的组合是 “空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。

循环条件

  1. for循环
  2. 字符串去除空格之后的length
  3. 起始位置取决于字符串有没有正负号

思路

  1. 去掉空格,判断长度
  2. 判断有没有正负号,决定startIndex从0还是1开始
  3. 遍历数字,拼接成整数:res = res * 10 + temp,类似于上面的整数反转
  4. 返回的时候把sign加上

code

public int myAtoi(String s) {
        s = s.trim();

        // 判断字符串是不是为空
        if (s.isEmpty()){
            return 0;
        }

        char firstChar = s.charAt(0);

        // 去除空格后,第一个字符如果既不是正负号也不是数字,那就返回0
        if (firstChar != '+' && firstChar != '-' && !Character.isDigit(firstChar)){
            return 0;
        }

        int res = 0;
        int sign = 1;
        // 这里要设置一个startIndex,因为正号可以不写,如果是正号,就要从第0位开始循环
        int startIndex = 0;

        if (firstChar == '-' || firstChar == '+'){
            // 说明有符号,正号或者负号都有可能,那么数字起始位就要向后挪一位
            startIndex = 1;
            sign  = (firstChar == '-') ? -1 : 1;
        }
        
        // 遍历,从1开始是因为前面认为是符号位
        for (int i = startIndex; i < s.length(); i++){
            // temp用来临时接收每个位置上的字符
            char temp = s.charAt(i);
            if (!Character.isDigit(temp)){
                break;
            }
            
            // 在循环内部,暂时没有考虑负号,只有在满足if条件,也就是绝对值溢出了,再去考虑正负号
            // (temp - '0') > 7,即使是负数,也就是最后一位是8,那么也一定越界,所以可以覆盖正负数。
            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (temp - '0') > 7)){
                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }

            /**
             * 注释掉的这部分犯了个错误
             * 错在,整个for循环里面并没有将数字添加正负号,所以所有的数字都是整数,只需要考虑正整数溢出的情况
             */
//            if (sign == -1){
//                // 说明是负数,看当前值是不是超越了边界情况
//                if (res < Integer.MIN_VALUE/10 || (res == Integer.MIN_VALUE/10 && (temp - '0') > 8 )){
//                    return Integer.MIN_VALUE;
//                }
//            } else {
//                if (res > Integer.MAX_VALUE || (res == Integer.MAX_VALUE && (temp - '0') > 7)){
//                    return Integer.MAX_VALUE;
//                }
//            }
            res = res * 10 + (temp - '0');
        }
  			// 把符号考虑进来
        return res * sign; 

    }

key point

1. 在循环内部,并没有正负号,所以在判断越界的情况,只需要考虑绝对值是不是超过了,就是result> Integer.MAX_VALUE这个情况
2. 从第几位开始处理数字

从第几位开始,要考虑一下几种情况,这些情况都是去除了空格位前提

  1. 首位有正号或者负号,那就要startIndex=1
  2. 首位没有,其实此时就是正数,那么startIndex = 0;

所以我们的处理方案是:startIndex默认位0,sign默认位1.

标签:temp,res,08,VALUE,力扣,startIndex,正负号,Integer,刷题
From: https://www.cnblogs.com/Jason-01011010/p/17749238.html

相关文章

  • 『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
    (08QtDesigner中容器布局和绝对布局的使用)1容器布局1.1设计容器布局先拖入一个容器Frame容器,然后拖入几个控件:把拖入的控件拖入容器中:选中容器,右键-布局-栅格布局:1.2保存文件并执行保存为test007_ConFra.ui,并生成test007_ConFra.py:#-*-coding:utf-8-*-#......
  • 08_方法
    1.方法是什么?Go中方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。Go通过接收者+方法的形式来实现面向对象的概念,一个类加上它的方法等价于面向对象中的一个类。但是一个重要的区别,在Go中,类型的代码和绑定在它上面的......
  • Python入门示例系列08 基础语法Syntax
    语法Syntax标点符号punctuation 标识符Identifiers(alsoreferredtoasnames)给变量variable、类class、对象object、方法method、函数function等取名(标识符)时有以下规则:   第一个字符必须是字母表中字母或下划线_。   标识符的其他的部分由字母、数字和下划线组成......
  • 力扣刷题笔记-07 整数反转
    07整数反转狗看了都摇头的年纪,纯爱战士一败涂地。怎么反转temp用来保存个位数res用来保存当前结果123,取模运算,这样就可以获得最后一位。比如对123%10,得到temp=3.判断res是不是溢出(重点)如果没有溢出,res扩大十倍,再加上个位数,就相当于是反转了。res=res*10+temp;返回......
  • 2023-10-08
    一、针对WPF窗体程序卡顿优化问题:添加500个以上数据点,切换数据/地址类型时会出现卡顿现象。WPF程序打开窗体卡顿的原因可能有很多。以下是一些常见的原因及其解决方法:资源过于繁重:应用程序在启动时加载大量资源,如图片、视频等,从而导致窗口开启变慢。可以考虑将资源压缩或使......
  • 2023-10-08 npx update-browserslist-db@latest==》不用管,能运行即可
    今天在hbuilderx运行微信小程序项目时显示一下内容:09:03:01.944npxupdate-browserslist-db@latest09:03:01.944Whyyoushoulddoitregularly:https://github.com/browserslist/update-db#readme​意思就是你的某个依赖需要更新了,如果它没有终止运行,那就不要管,能跑......
  • 08_三个数字排序
    三个数字排序!/bin/bashread-p"请输入一个整数:"num1read-p"请输入一个整数:"num2read-p"请输入一个整数:"num3#不管谁大谁小,最后都打印echo"$num1,$num2,$num3"#num1中永远存最小的值,num2中永远存中间值,num3永远存最大值tmp=0if[$num1-gt$num2];t......
  • 【刷题笔记】73. Set Matrix Zeroes
    题目Givenan *m* x *n* matrix.Ifanelementis 0,setitsentirerowandcolumnto 0.Doit in-place.Followup:AstraightforwardsolutionusingO(mn)spaceisprobablyabadidea.AsimpleimprovementusesO(m + n)space,butstillnotthebest......
  • 再谈 qbxt2023国庆刷题 Day7 T2 树
    T2倍增+换根即可,但赛时难写赛时想得线段树二分,也可from:https://www.cnblogs.com/fox-konata/p/17742669.html回头一看老师代码,发现换根换的非常神奇,长见识了方法0:第一次思考,以为要记录走排名为\(a_x\)和\(a_x+1\)的两个倍增数组,但发现并不好合并,也许可以憋出来,但还是......
  • 力扣-2427-公因子的数目
    给你两个正整数a和b,返回a和b的公因子的数目。如果x可以同时整除a和b,则认为x是a和b的一个公因子。 示例1:输入:a=12,b=6输出:4解释:12和6的公因子是1、2、3、6。示例2:输入:a=25,b=30输出:2解释:25和30的公因子是1、5。提示:1<=a,......