题目
思路及代码
1、
1、不考虑正负号及特殊情况时:
采用for循环从左到右依次乘10累加,并将结果依次乘10累加(不能根据字符串长度进行按位求幂累加,因为字符串长度可能会超过int类型的最大位数,求得过程本身就已越界)
2、当字符串首位字符为'-'时,相减;为'+'或者首字母为数字时直接累加;
3、当字符串首字符为除2中情况的其他字符时,则不为数字,返回0;
判断依据:ASCII码中48~57为0到9十个阿拉伯数字。所以,当字符1要转换成数字1时,需要将字符1转换成ASCII码翻译出的数字再减去48(字符'0'),才是我们要的解。注意,这里可以判断其他字符,如果换算之后的数字不在0到9,就说明是其他字符,则直接返回0。
2、特殊情况
2.1 字符串为null和字符串长度为0(注意二者意义不一样,为空代表没有任何属性,也就不具备length属性) 返回0;
2.2 数组越界 必须在累加的过程中进行是否越界的判断,否则就是拿错误的结果进行是否越界的判断,结果本身就是错的。
int long 都是表示整型数字
int 的存储长度是2的32次方 取值范围是“-2^32”到“2^32-1”
Long的存储的长度是2的64次方 范围是 ”-2^64“ 到”2^64 -1“
import java.lang.Integer;
public class Solution {
public int StrToInt(String str) {
//不考虑任何情况的核心求解部分
//for循环解决
//特殊情况 字符串为null和字符串长度为0
if(str == null || str.length() ==0)return 0;
boolean flag = true;
//首字符是否为+-
long n = 0;
for(int i =0;i<str.length();i++){
if(i==0 && str.charAt(0) == '-')
flag =false;
else
if(i==0 && str.charAt(0)=='+')
continue;
else{
int temp = str.charAt(i) - '0';
if(temp < 0|| temp >9) return 0;
else{
n= flag? (n*10+temp):(n*10-temp);
//判断是否已越界
if(n > Integer.MAX_VALUE || n< Integer.MIN_VALUE)
return 0;
}
}
}
return (int)n;
}
}
代码
import java.util.regex.Pattern;
import java.lang.Integer;
public class Solution {
public int StrToInt(String str) {
if(str == "") return 0;
if(str.equals('0')) return 0;
String p= "[+-]?[1-9]+[0-9]*";
double tem = 0;
if(Pattern.matches(str,p)){
if(str.charAt(0)=='-'){
for(int i =1;i<str.length();i++){
tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
}
tem = - tem;
}else{
if(str.charAt(0) =='+'){
for(int i =1;i<str.length();i++)
tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
}else{
for(int i =0;i<str.length();i++){
tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
}
}
//return tem;
}
}
if(tem > Integer.MAX_VALUE || tem < Integer.MIN_VALUE) return 0;
return (int)tem;
}
}