剑指Offer+第49题+把字符串转换成整数+java

本文深入探讨了一种不依赖库函数将字符串转换为整数的算法,详细讲解了合法性检查、数字转换及溢出处理的过程,适用于处理各种边界情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

解题思路:

1.判断字符串输入是否合法,重点判断一个字符串除第一个字符外是否包含非数字字符,若包含,则返回0,不包含,则进行转换成整数操作;

2.取出字符串第一个字符,遍历第一个字符之后的所有字符,计算除第一个字符外的所有字符串组成的整数大小;

3.若第一个字符不是正负号,则加上第一个字符对应的数字大小。

这个问题主要是处理边界和非法输入比较麻烦。

代码:

public class Offer49 {

	public int strToInt(String str){
		if(str == null || str.length() == 0 || hasNonNumerical(str))
			return 0;// 如果字符串为空并且包含非数字字符
		
		// 此时的字符串肯定是数字字符串
		// 因为返回值限定为int型,所以无需考虑大数问题
		char firstChar = str.charAt(0);
		int sumExcludeFirst = 0;// 先将除第一位的数字转换成整数
		int sum = 0;
		for(int i = 1;i<str.length();i++){
			char c = str.charAt(i);// 拿出当前字符
			int convert = c-'0';//将字符转换成整数
			
			if(firstChar =='+'&& sum<=Integer.MAX_VALUE)
				sum += convert*Math.pow(10, str.length()-1-i);
			
			if(firstChar == '-'&& sum >=Integer.MIN_VALUE)
				sum -= convert*Math.pow(10, str.length()-1-i);
			
			if(firstChar >='0'&&firstChar <='9'&& sum<=Integer.MAX_VALUE)
				sum += convert *Math.pow(10, str.length()-1-i);
		}
		
		int first = firstChar - '0';//将字符转换程整数
		if(firstChar >= '0'&& firstChar <= '9')
			sum += first*Math.pow(10, str.length()-1);
		if(sum>Integer.MAX_VALUE ||sum < Integer.MIN_VALUE)
			return 0;
		
		return sum;
	}
	
	// 判断一个字符串除第一个字符外是否包含非数字字符,第一个字符可以是+或者是—
	public boolean hasNonNumerical(String str) {
		int length = str.length();
		
		// 取出第0位,若第0位如果是数字或者是+,—则继续遍历,否则直接返回false
		char c = str.charAt(0);
		if((c>='0'&&c<='9') || (c=='+') || (c=='-')){// 有必要进行之后的遍历
			for(int i = 1;i<length;i++){
				c = str.charAt(i);// 取出当前字符
				if(c<'0'||c>'9')
					return true;// 证明包含非数字字符,直接跳出循环,返回false
			}
		}else
			return true;// 首位就包含除正负号外的非数字字符
		
		return false;
	}

	public static void main(String[] args) {
		
		Offer49 of49 = new Offer49();
		
		//功能测试,1,输入的字符串表示正数
		String str1 = "123";
		System.out.println(of49.strToInt(str1));
		
		//功能测试,2,输入的字符串表示正数
		String str2 = "+123";
		System.out.println(of49.strToInt(str2));
		
		//功能测试,3,输入的字符串表示负数
		String str3 = "-123";
		System.out.println(of49.strToInt(str3));
		
		//功能测试,4,输入的字符串表示0
		String str4 = "0";
		System.out.println(of49.strToInt(str4));
		
		//边界值测试,5,最大的正整数
		String str5 = "Integer.MAX_VALUE";
		System.out.println(of49.strToInt(str5));
		
		//边界值测试,6,最小的负整数
		String str6 = "Integer.MIN_VALUE";
		System.out.println(of49.strToInt(str6));
		
		//特殊输入测试,7,输入字符串为NULL指针
		String str7 = null;
		System.out.println(of49.strToInt(str7));
		
		//特殊输入测试,8,输入字符串为空字符串
		String str8 = "";
		System.out.println(of49.strToInt(str8));
		
		//特殊输入测试,8,输入字符串有非数字字符
		String str9 = "+123-=";
		System.out.println(of49.strToInt(str9));

	}

}

运行结果:

123
123
-123
0
0
0
0
0
0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值