Day49:将字符串转换成整数

时间:2022-07-24
本文章向大家介绍Day49:将字符串转换成整数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——将字符串转换成整数

题目描述:

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0

示例1

输入: +2147483647 1a33 输出: 2147483647 0

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体实现

思路一:

  1. 将输入的字符串转换成字符数组。从大下标开始,反向对每个字符逐个处理。
  2. 若当前字符的ASII码在[48-57],注意是闭区间。则代表当前字符是[0~9],继续判断下一个。
  3. 当遍历到下标为0的字符时,需要进行特殊情况的几个判断。包括是否越界,是否是临界值,是否为负号等。   接下来我们用Java实现其思路:
public class Solution{
	public int StrToInt(String str){
		if(str == null || str.length() == 0){
			return 0;
		}
		int result = 0;
		char[] chs = str.toCharArray();
		int len = chs.length;
		for(int i = len - 1, j = 0; i > 0; i--, j++){
			int c = (int) chs[i];
			if(c < 48 || c > 57){
				return 0;
			}else{
				result += (c - 48)*Math.pow(10, j);
			}
		}
		int c = (int)chs[0];
		if (c <= 57 && c >= 48){
			result += 
			(c - 48) * Math.pow(10, len - 1);
		}
		if(result < -2147483648 ||  result > 2147483647){
			return 0;
		}else if(str.equals("2147483648")){
			if(c == 45){
				result = -2147483648;
			}
		}else if(str.equals("-2147483648")){
			result = -2147483648;
		}else{
			if (c == 45){
				result = -result;
			}
		}
			return result;
	}
}

代码效果图如图所示:

思路二: 1、 先判断首字符是否为负号。 2、 判断当前字符是否表示数字。 3、 (res << 1) + (res << 3) 即 res2+res8=res*10 4、[0-9]的二进制表示低四位刚好就是[0~9]。 (chs[i] & 0xf)即取低四位值。   接下来我们用java和python实现。 1、首先我们用java实现:

public class Solution{
	public int StrToInt(String str){
		if(str == null || str.length() == 0){
			return 0;
		}
		int n = str.length(), s= 1;
		char[] chs = str.toCharArray();
		int res = 0;
		if(chs[0] == '-')
			s = -1;
		for(int i = (chs[0] == '-' || chs[0] == '+') ? 1 : 0; i < n; ++i){
			if(!('0' <= chs[i] && chs[i] <= '9'))
				return 0;
			res = (res << 1) + (res << 3) + (chs[i] & 0xf);
		}
			return (int) res*s;
	}
}

代码效果图如图所示:

2、接下来我们用python实现:

class Solution:
	def StrToInt(self, s):
		if len(s) == 0 or s == "":
			return 0
		s = list(s)
		j = 0
		flag = True
		if s[0] == '-' or s[0] == '+':
			j = 1
			if s[0] == '-':
				flag = False
		sum = 0
		for i in range(j, len(s)):
			if ord(s[i]) < 48 or ord(s[i]) > 57:
				return 0
			sum = sum * 10 + (ord(s[i]) - 48)
		if flag == False:
			return sum*(-1)
		else:
			return sum

代码效果图如图所示:

总结

  本题是主要考察字符串转化为整数,本题较为简单,不过需要我们注意的是int整型数据类型的范围,也就是在java中要考虑其溢出的情况。但是由于python中没有int这一类型,因此不存在溢出的情况,只需要考虑数字以及±*/这些运算符号的ASCII码。本道题我们应用了两种方法将其实现,首先就是将其存在数组里面,然后从右往左进行遍历,转换。另一种就是先判断负号,在进行判断是否为数字,并且通过java以及python两种方式将其实现。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1] ouyangyanlan [2] 天举的博客