给定一个字符串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); } }