字符串问题之 将证书字符串转成整数值

给定一个字符串str,如果str符合日程书写的证书形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0

  str="123"

整体思路:

 首先判断这个字符串的合法性

 然后开始遍历

   遍历时候一定要注意了:

   32位整型,负数的绝对值 大于 整数的 绝对值 范围

    遍历的 str=res*10+cur    

    重点在于遍历的过程中就判断是否溢出问题:

        如果在 res加上cur之前,发现res已经小于minq,那么res加上cur一定会溢出

       如果在 res加上cur之前,发现res已经等于minq,但又发现cur小于minr,那么当res加上cur之后一定会溢出

最后根据posi决定返回值 ,同时考虑溢出的问题。

上代码:

package TT;

public class Test3 {
 
    public static boolean isValid(char[] chas){
        if(chas[0]=='-' && (chas[1]<'0'||chas[1]>'9')){
            return false;
        }
        
        if(chas[0]=='-'&&(chas.length==1 ||chas[1]=='0')){
            return false;
        }
        if(chas[0]=='0'&&chas.length>1){
            return false;
        }
        
        for(int i = 1; i<chas.length; i++){
            
            if(chas[i]<'0'||chas[i]>'9'){
                return false;
            }
            
        }
        return true;
    }
     
    
    
    public static int convert(String str){
        
        if(str==null || str.equals(" ")){
            return 0;
        }
        
        char[] chas = str.toCharArray();
        if(!isValid(chas)){
            return 0;
        }
        
        boolean posi = chas[0] =='-' ? false :true;
        int minq = Integer.MIN_VALUE / 10;
        int minr = Integer.MIN_VALUE % 10;
        int res = 0;
        int cur = 0;
        for(int i = posi ? 0 : 1; i<chas.length; i++){
            
            cur = '0'-chas[i];
            if((res<minq) || (res==minq && cur<minr)){
                return 0;
            }
            res = res*10+cur;
            
            
        }
        
        if(posi && res == Integer.MIN_VALUE){
            return 0;
        }
        return posi ? -res : res;
    }
    
    
    public static void main(String[] args){
        
        String str = "-1234";
        int a = convert(str);
        System.out.println(a);
        
    }
    
    
    
    
    
    
}
原文地址:https://www.cnblogs.com/toov5/p/7395935.html