/*
* 问题
* 将整数字符串转成整数值 不满足转换条件返回flase 超出范围则返回0
*
* 思考 1:如果字符串表示的数值溢出整数范围,要怎么判断?
* 2:该用正数存储还是负数存储?(整数的负数范围比正数范围大1)
* 3:哪些情况不满足转换条件?
*
* 解题思路
* 先判断str 是否满足转换条件
* 一 不以"-"和数字开头
* 二 以"-"开头但是长度为1或者"-"接0,以0开头 且长度大于1
* 三 满足一二但是字符串中含有非数字
*
* 再判断是否有溢出
* 转化过程中先统一用负数来表示 负数绝对值更大.
* 溢出时的数字无法完成转换 所以无法直接比较 在遍历时
* 比较Integer.MIN_VALUE%10与Integer.MIN_VALUE/10的
* 值和字符串遍历到当前位cur和前一位的总值res的大小关系
*
* 补充:字符和整数作比较是把字符转化成Ascii在做比较,故所得结果的也是整数值
* */
public class SQ3 {
public static boolean isValidchar(char[] chas) {
if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9'))
return false;
if ((chas[0] == '-' && chas.length == 1)||
(chas[0] =='0'&& chas.length > 1))
return false;
for (int i = 0; i < chas.length; i++) {
if (chas[0] < '0' || chas[0] > '9')
return false;
}
return true;
}
public static int convert(String str){
if (str==null||str.equals(""))
return 0;
char[] chars =str.toCharArray();
if (!isValidchar(chars)){//if+return 都不用else
return 0;
}
boolean posi=chars[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<chars.length;i++){
cur='0'-chars[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="13576462";
System.out.println(convert(str)+1);
}
}
12-27
3816