LeetCode-8-算法- 字符串转换整数 (atoi)(中等)

23 篇文章 0 订阅

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

提示:

本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 

示例 1:

输入: "42"
输出: 42
示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。
示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

审题:

根据给定的一系列规则转换字符串为整数。

需要注意的是可能会有符号,还要确保转换后的数字最大最小值。

思考:

按照规则一个一个字符遍历,不符合规则就结束,简单粗暴的方法。

可以使用数组,将字符串放入数字中。

解题:

解法一:暴力破解,存在很多问题。需要单独判断正负号,需要判断是否超出范围。

	// 暴力解法
	public int AtoiI(String str) {
		str = str.substring(1, str.length() - 1);// 去掉字符串的双引号。
		str = str.trim();// 去掉空格。
		String strs = "";
		char[] chars = str.toCharArray();// 将字符串转换为字符串数组。
		if (strs.equals("-")) {// 如果只是一个字符-。返回0
			return 0;
		}
		for (int i = 0; i < chars.length; i++) {// 循环遍历字符串。
			if (chars[i] == '-' || chars[i] == '1' || chars[i] == '2' || chars[i] == '3' || chars[i] == '4'
					|| chars[i] == '0' || chars[i] == '5' || chars[i] == '6' || chars[i] == '7' || chars[i] == '8'
					|| chars[i] == '9') {// 判断那些开头符合要求,不符合要求结果为0.
				strs += chars[i];// 拼接成为一个字符串格式的整数。if保证了这是一个整数。
			} else {
				return Integer.parseInt(strs);
			}
		}
		return Integer.parseInt(strs);
	}

解法二:思路基本和方法一相思,但是实现方法不同。

	// 官方
	// charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
	public int myAtoi_1(String str) {
		str = str.trim();
		str = str.substring(1, str.length() - 1);
		int index = 0, sign = 1, total = 0;
		// 1. Empty string 判断长度是否是零,为零则返回零。
		if (str.length() == 0)
			return 0;

		// 2. Remove Spaces 删除空格。如果字符串中间有空格,跳过空格。
		while (str.charAt(index) == ' ' && index < str.length())
			index++;

		// 3. Handle signs 开头开始处,除去上一步的空格。判断符号
        //方法一中没有将符号单独处理,导致混乱,将符号单独处理最后结果乘以+1或者-1.
		if (str.charAt(index) == '+' || str.charAt(index) == '-') {
			sign = str.charAt(index) == '+' ? 1 : -1;
			index++;
		}

		// 4. Convert number and avoid overflow
		while (index < str.length()) {
			char test = str.charAt(index);
			// 将char转换为数字,如果不是数字,就跳出while循环。
			int digit = test - '0';
			if (digit < 0 || digit > 9)
				break;

			// check if total will be overflow after 10 times and add digit
			// &&之前判断total 之后判断digit
            //前半部分判断的是个位之上的和,后半部分判断的是个位数。
            //如果第一个条件是假,后边的条件就跳过。
			if (Integer.MAX_VALUE / 10 < total || Integer.MAX_VALUE / 10 == total && Integer.MAX_VALUE % 10 < digit)
				return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;

			total = 10 * total + digit;
			index++;
		}
		return total * sign;
	}

知识点:

int test = 'a' - 0;
System.out.println(test);
//结果是97

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值