剑指offer-6.把字符串转换成整数(318)

  • 题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。

    • 输入描述:

      输入一个字符串,包括数字字母符号,可以为空
      
    • 输出描述:

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

      输入:
      +2147483647
          1a33
      输出:
      2147483647
          0
      
  • 代码

    package _06.把字符串转换成整数;
    
    /**
     * 题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,
     * 但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
     * 
     * @author Administrator
     *
     */
    public class StrToInt {
    	public static void main(String[] args) {
    		int strToInt = strToInt("+2147483648");
    		System.out.println(strToInt);
    	}
    
    	public static int strToInt(String str) {
    		String regex = "([-\\+]{1}\\d{1,10})|(\\d{0,10})";
    		if(!str.matches(regex)){
    			return 0;
    		}
    		// 最后结果
    		int result = 0;
    		// 符号:默认为+号
    		boolean negative = false;// +号
    		String limit =Integer.toString(Integer.MIN_VALUE).substring(1);
    		int i = 0;
    		if (str.length() > 0) {
    			//1. 判断符号
    			if (str.charAt(0) < '0')// +或者-;
    			{
    				if (str.charAt(0) == '-')// -
    				{
    					negative = true;
    				} else if (str.charAt(0) != '+') {// 如果不为-号的就一定为+,否则格式错误
    					return 0;
    				}
    				i++;//在有符号的时候加1到数值
    			}
    			//2.判断数值是否溢出
    			String strResult = str.substring(i);
    			//负数
    			if(negative){
    				if(strResult.compareTo(limit) > 0){
    					return 0;
    				}
    			}
    			//正数
    			if(!negative){
    				if(strResult.compareTo(limit) >= 0){
    					return 0;
    				}
    			}
    			//3.计算数值
    			while(i<str.length()){
    				result = result*10 + (str.charAt(i++)-48);
    			}
    			return negative?-result:result;
    		} else {// 空串
    			return 0;
    		}
    	}
    }
    
  • 第二次改进代码

    	/**
    	 * 1.先简单的判断输入参数
    	 * 2.获取字符串数值的符号(判断第一个符号的格式)
    	 * 3.循环:判断符号的格式、如正确则计算、判断是否溢出
    	 * @param str
    	 * @return
    	 */
    	//标识输入的字符串格式是否有效
    	public static boolean isValid = false;
    	public static int strToInt1(String str) {
    		//1.先简单的判断输入参数
    		if(str == null || str.trim().equals("")) return 0;
    		
    		//默认为加号
    		boolean negative = false;
    		//结果:可以定义为long型的变量,判断溢出的时候和整型的最大、最小值比较
    		int result = 0;
    		//遍历str字符串
    		int index = 0;
    		
    		//2.获取字符串数值的符号(判断第一个符号的格式)
    		//如果第一个符号是小于'0'的,那么符号要么为 +,要么为-;如果大于'0',则表示数值为正数
    		if(str.charAt(0) < '0'){
    			if(str.charAt(0) == '-'){
    				negative = true;
    			}
    			else if(str.charAt(0) != '+'){
    				return 0;
    			}
    			index++;//有显示的符号时 加1
    		}
    		
    		//3.循环:判断符号的格式、如正确则计算、判断是否溢出
    		while(index < str.length()){
    			//判断符号的格式
    			if(str.charAt(index) >= '0' && str.charAt(index) <= '9'){
    				//符号格式正确,累加/减
    				result = (negative == false) ? result*10 + (str.charAt(index)-'0')
    						: result*10 - (str.charAt(index)-'0');
    				//判断结果是否溢出:正数溢出:符号变为负号(<0);负数溢出,符号变为正号(>0)
    				//正数
    				if(!negative && result < 0){
    					isValid = false;	
    					return 0;
    				}
    				//负数
    				if(negative && result > 0){
    					isValid = false;	
    					return 0;
    				}
    				isValid = true;	
    				index++;
    			}
    			else{
    				isValid = false;	
    				return 0;
    			}
    		}
    		return  result;
    	}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值