剑指--把字符串转换成整数(分析)

剑指–把字符串转换成整数

1,题目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2,思路:

代码一:
根据题意,有以下四种字符需要考虑:

  • (1)首部空格: 删除之即可;

  • (2)符号位: 三种情况,即 “+” , “-”, ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。

  • (3)非数字字符: 遇到首个非数字的字符时,应立即返回。

  • (4)数字字符:

    字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
    数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
    res = 10 *res + x
    x = ascii © - ascii(‘0’)

  • (5)关于越界处理:

    题目要求返回的数值范围应在 [-2^{31}, 2^{31} - 1],因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。

代码二:
第一步,跳过前面若干个空格,如果字符串全是空格直接返回
第二步,判断正负号,如果是正负号,还需要将指针i,跳过一位
第三步,循环判断字符是否在 0~9之间

  • '0’的ASCII码是48,'1’的是49,这么一减就从就可以得到真正的整数值

  • 判断是否大于 最大32位整数

  • 判断是否小于 最小32位整数

第四步,如果有负号标记则返回负数。

3,代码:

代码一:

class Solution {
    public int strToInt(String str) {

        /*
        根据题意,有以下四种字符需要考虑:

(1)首部空格: 删除之即可;
(2)符号位: 三种情况,即 ''++'' , ''-−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。
(3)非数字字符: 遇到首个非数字的字符时,应立即返回。
(4)数字字符:
     字符转数字: “此数字的 ASCII 码” 与 “ 00 的 ASCII 码” 相减即可;
     数字拼接: 若从左向右遍历数字,设当前位字符为 cc ,当前位数字为 xx ,数字结果为 resres ,则数字拼接公式为:
       res = 10 *res + x 
       x = ascii(c) - ascii('0')
(5)关于越界处理:
        题目要求返回的数值范围应在 [-2^{31}, 2^{31} - 1],因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。


        */

        char[] c = str.trim().toCharArray();//出掉开头空格,并转换成字符数组
        if(c.length == 0) 
            return 0;
        int res = 0;
        int bndry = Integer.MAX_VALUE / 10;//这个是为了防止越界,做的处理
        int i = 1;//i表示指向字符数组的下标位置
        int sign = 1;//表示正负数的一个标志
        if(c[0] == '-') 
            sign = -1;//表示最后这个数是一个负数
        else if(c[0] != '+') 
                i = 0;//表示从字符数组的下标0开始循环
        for(int j = i; j < c.length; j++) {
            if(c[j] < '0' || c[j] > '9') 
                break;//则开头部分并不是数字,则不需要进行转换,直接返回0
            if(res > bndry || res == bndry && c[j] > '7') //这里是做了越界的处理
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + (c[j] - '0');//这个就是将字符转换为正数的转换公式
        }
        return sign * (int)res;



    }
}

代码二:

class Solution {
    public int strToInt(String str) {

       
        
		if(str==null) {
			return 0;
		}
		int n = str.length();
		int i = 0;
		int res = 0;
		boolean is_negative = false;
		//第一步,跳过前面若干个空格
		while(i<n && str.charAt(i)==' ') {
			++i;
		}
		//如果字符串全是空格直接返回
		if(i==n) {
			return 0;
		}
		//第二步,判断正负号
		if(str.charAt(i)=='-') {
			is_negative = true;
		}
		//如果是正负号,还需要将指针i,跳过一位
		if(str.charAt(i)=='-' || str.charAt(i)=='+') {
			++i;
		}
		//第三步,循环判断字符是否在 0~9之间
		while(i<n && str.charAt(i)>='0' && str.charAt(i)<='9') {
			//'0'的ASCII码是48,'1'的是49,这么一减就从就可以得到真正的整数值
			int tmp = str.charAt(i)-48;
			//判断是否大于 最大32位整数
			if(!is_negative &&(res>214748364 ||(res==214748364 && tmp>=7))) {
				return 2147483647;
			}
			//判断是否小于 最小32位整数
			if(is_negative &&(-res<-214748364 || (-res==-214748364 && tmp>=8))) {
				return -2147483648;
			}
			res = res*10 + tmp;
			++i;
		}
		//如果有负号标记则返回负数
		if(is_negative) {
			return -res;
		}
		return res;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值