将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
"+2147483647"
2147483647
"1a33"
0
import java.util.*; public class Solution { public int StrToInt(String str) { if(str==null||str.equals("")){ //若为空或者为空字符则无效 return 0; } int count=0; //最后的数字 int n=1;//每一次的乘数,先是从1开始 int flg=1;//默认为1,代表正数,只要最后返回 count*flg即可 char[] contrast={'0','1','2','3','4','5','6','7','8','9'};//对比转换string和int的数组 String str1=""; //先拿到下标0处的元素 if(str.charAt(0)=='+'){ //为正数,不变 } else if (str.charAt(0)=='-'){ flg=-1; //为负数 } else if (str.charAt(0)>='0'&&str.charAt(0)<='9') { //为数字 str1+=str.charAt(0); //下标0处是数字,则拼接到str1上去 }else { //不合法元素 return 0; //下标0处的元素为字符,使用返回0 } for(int i=1;i<str.length();i++){ //先得到数字,从1下标开始,因为0已经判断了 if (str.charAt(i)>='0'&&str.charAt(i)<='9'){ //是数字则拼接 str1+=str.charAt(i); }else { return 0;//遇到字符,返回0 } } //上面已经得到了我们想要的数字字符串了,在str1里面 for (int i=str1.length()-1;i>=0;i--){ //从最后拿取每一个数据 for (int j=0;j<contrast.length;j++){ //遍历对照数组,相等的时候,拿的到下标就是当前字符对应的数字 if(str1.charAt(i)==contrast[j]){ //数据对上了 count+=j*n;//最后一位的值 n*=10; //为接下来的一位做准备 break; //跳出对比的循环 } } } return count*flg; } }
public class Solution { public int StrToInt(String str) { char crr[] = str.toCharArray(); int flag = 1; int sum = 0; int i = 0; if (crr.length == 0) { return 0; } if (crr[0] == '-' || crr[0] == '+') { if (crr[0] == '-') { flag = -1; } i++; } for (; i < crr.length; i++) { if (crr[i] >= '0' && crr[i] <= '9') { sum = sum * 10 + (crr[i] - '0'); } else { return 0; } } return sum * flag; } }
public class Solution { public int StrToInt(String str) { char[] s = str.toCharArray(); if (str.length() == 0 || str == null) return 0; int flag = 1; if (s[0] == '-') flag = -1; if (s[0] == '+' || s[0] == '-' ) s[0] = '0'; int sum = 0; for (int i = 0; i < s.length; i++) { if (!(s[i] >= '0' && s[i] <= '9')) return 0; else { sum = sum * 10 + (s[i] - '0'); } } return sum * flag; } }
public class Solution { public int StrToInt(String str) { char[] chs = str.toCharArray(); if(chs == null || chs.length == 0) { return 0; } int flag = 1; int sum = 0; if(chs[0] == '+') { flag = 1; chs[0] = '0'; } else if(chs[0] == '-') { flag = -1; chs[0] = '0'; } for (int i = 0; i < chs.length; i++) { if(chs[i] < '0' || chs[i] > '9') { sum = 0; break; } sum = sum * 10 + chs[i] - '0'; } return flag*sum; } }
public class Solution { public int StrToInt(String str) { if(str == null || str.length() == 0){ return 0; } int a = 1; char[] ch = str.toCharArray(); if(ch[0] == '-'){ a = -1; ch[0] = '0'; } if(ch[0] == '+'){ a = 1; ch[0] = '0'; } int sum = 0; for(int i = 0;i < ch.length;i++){ if(!Character.isDigit(ch[i])){ sum = 0; break; } sum = sum *10 + ch[i] -'0'; } return sum * a; } }
public class Solution { public int StrToInt(String str) { try { if(str ==null || str.length() ==0){ return 0; } if(str.length() ==1 ){ if(!isdigit(str.charAt(0))){ return 0; } return str.charAt(0) - ('0'); } //肯定长度大于1 if(str.charAt(0)!='+' && str.charAt(0) !='-' && !isdigit(str.charAt(0))){ return 0; } boolean[] flag= new boolean[]{false,false};//false,false代表是负数 if(str.charAt(0)=='+' || isdigit(str.charAt(0))){ //是正数 if(str.charAt(0)=='+'){ //第一位是+号 flag[0] = true; flag[1] = true; } if(isdigit(str.charAt(0))){ flag[0] = true; flag[1] = false; //第一位是数字 } } //肯定第一位是符合标准的 for (int i = 1; i < str.length(); i++) { if(!isdigit(str.charAt(i))){ return 0; } } //每一位都是符合标准的 char[] chars = str.toCharArray(); if(flag[0] & flag[1]){ //如果第一位是+号 int ret = 0; for (int i = 1; i < chars.length; i++) { ret = ret* 10 + chars[i] - '0'; } return ret; } else if(flag[0] & !flag[1]){ //如果第一位是数字 int ret = 0; for (int i = 0; i < chars.length; i++) { ret = ret * 10 + chars[i] - '0'; } return ret; } else{ //第一位是负数 int ret = 0; for (int i = 1; i < chars.length; i++) { ret = ret* 10 + chars[i] - '0'; } return -ret; } } catch (NumberFormatException e) { return 0; } } public boolean isdigit(char number){ if( number >= '0' && number <= '9'){ return true; } else{ return false; } } }
import java.util.*; public class Solution { public int StrToInt(String str) { StringBuilder s = new StringBuilder(str); if(s.length()==0) return 0; int sym = 1; if(s.charAt(0) == '-'){ sym = -1; s.deleteCharAt(0); } else if(s.charAt(0) == '+'){ sym = 1; s.deleteCharAt(0); } int sum = 0; for(int i = 0; i < s.length(); i++){ if(s.charAt(i) < '0' || s.charAt(i) > '9'){ sum = 0; break; } else{ sum = sum * 10 + (s.charAt(i) - '0'); } } return sym * sum; } }
import java.util.*; public class Solution { public int StrToInt(String str) { int flag = 1; int sum = 0; char[] strArr = str.toCharArray(); for(int i = 0 ; i < strArr.length ; i++){ if(strArr[i] >= 48 && strArr[i] <=57){ sum += (strArr[i]-48)*Math.pow(10,strArr.length - i - 1); }else{ if(i == 0){ if(strArr[i] == '-'){ flag *= -1; }else if(strArr[i] == '+'){ continue; }else{ return 0; } }else{ return 0; } } } return sum*flag; } }
//我觉得Leetcode上的题目用例更加严谨一些 class Solution { public int myAtoi(String s) { s=s.trim(); if(s.length()==0) return 0; int flag=1; int id=0; if(s.charAt(0)=='+'){ id++; flag=1; }else if(s.charAt(0)=='-'){ id++; flag=-1; }else{ flag=1; } long sum=0; while(id<s.length()){ if(!Character.isDigit(s.charAt(id))) break; int n=s.charAt(id)-'0'; if(sum>Integer.MAX_VALUE || (sum>=Integer.MAX_VALUE/10 && n>Integer.MAX_VALUE%10)){ return flag==1? Integer.MAX_VALUE:Integer.MIN_VALUE; }else{ sum=sum*10+n; id++; } } if(flag*sum>Integer.MAX_VALUE){ return Integer.MAX_VALUE; }else if(flag*sum<Integer.MIN_VALUE){ return Integer.MIN_VALUE; }else{ return flag*(int)sum; } } }
public class Solution { public int StrToInt(String str) { if(str == null || str.length() == 0) { return 0; } String s = str.trim(); char[] chs = s.toCharArray(); if(chs.length == 1) { if(!Character.isDigit(chs[0])) { return 0; } else { return chs[0] - '0'; } } // 第一个字符不是加减号,也不是数字 if(chs[0] != '+' && chs[0] != '-' && !Character.isDigit(chs[0])) { return 0; } int ans = 0, index = 0; boolean isNegative = false; if(chs[0] == '-') { isNegative = true; index++; } else if(chs[0] == '+') { isNegative = false; index++; } else { index = 0; } for(int i = index; i < chs.length; i++) { if(!Character.isDigit(chs[i])) { return 0; } ans = ans*10 + (chs[i] - '0'); } if(isNegative) { ans = -ans; } return ans; } }
import java.util.HashMap; public class JZ49 { public static void main(String[] args) { JZ49 jz49 = new JZ49(); System.out.println(jz49.StrToInt("2147483647")); System.out.println(jz49.StrToInt("-2147483648")); System.out.println(jz49.StrToInt("-2147483649")); } private HashMap<Character, Integer> map = new HashMap<>(){ { put('0', 0); put('1', 1); put('2', 2); put('3', 3); put('4', 4); put('5', 5); put('6', 6); put('7', 7); put('8', 8); put('9', 9); } }; public int StrToInt(String str) { if (str == null || str.isEmpty()) { return 0; } char firstChar = str.charAt(0); int index = 0; //默认是正号 int limit = -Integer.MAX_VALUE; boolean flag = true; //第一位不是数字 if (!map.containsKey(firstChar)) { //只有单独一个符号,非法 if (str.length() == 1) { return 0; } index++; //第一位是负号 if (firstChar == '-') { flag = false; limit = Integer.MIN_VALUE; } //第一位非法符号 else if (firstChar != '+'){ return 0; } } int result = 0; for (;index < str.length(); index++) { //正常数字 if (map.containsKey(str.charAt(index))) { int digit = map.get(str.charAt(index)); result = result * 10; int r = limit + digit; //溢出判断 if (result < limit + digit) { return 0; } result = result - digit; //非法字符 } else { return 0; } } return flag ? -result : result; } }
public class Solution { public int StrToInt(String str) { int f =0; int i =0; int zf=1; if(str ==null || str.equals("")) return 0; if(str.charAt(0)=='-') { i=1; zf=0; } if(str.charAt(0)=='+') i=1; for(i=i;i<str.length();i++) { int c =str.charAt(i); if(c>='0' && c<='9') { f=f*10+c-'0'; } else return 0; } return zf==1?f:-f; } }
//走到这里,说明是有效字符,且不是正负号 //超过2147483647 if(!flag && res * 10 >= 2147483640 && ch[i] >= '8'){ return Integer.MAX_VALUE; } //小于-2147483648 if(flag && res * 10 >= 2147483640 && ch[i] >= '9'){ return Integer.MIN_VALUE; }
public int StrToInt(String str) { int res = 0; char[] ch = str.toCharArray(); boolean flag = false;//flag为true表示负数 for(int i = 0; i < ch.length; i++){ //存在不合法字符,直接返回0 if(!(ch[i] >= '0' && ch[i] <= '9') && ch[i] != '-' && ch[i] != '+') return 0; if(i == 0 && ch[i] == '-'){ flag = true; continue; }else if(i == 0 && ch[i] == '+'){ continue; } //走到这里,说明是有效数字 //超过2147483647:如果res > 214748364, 则res至少为214748365,res*10必然>2147483647 //如果卡边界,res * 10 = 2147483640,则ch[i]为0~7时合法 if(!flag && ((res > 214748364) || (res == 214748364 && ch[i] >= '7'))){ return Integer.MAX_VALUE; } //小于-2147483648 if(flag && ((res > 214748364) || (res == 214748364 && ch[i] >= '8'))){ return Integer.MIN_VALUE; } res = res * 10 + ch[i] - '0'; } return flag ? -res : res; }
public int StrToInt(String str) { boolean matches = str.matches("[+-]?\\d+"); if (!matches) { return 0; } else { int temp = 1; int index = str.length()-1; int result = 0; if (str.matches("\\d+")){ while (index >= 0) { result += (str.charAt(index--) - 48) * temp; temp*=10; } } else { while (index > 0) { result += (str.charAt(index--) - 48) * temp; temp*=10; } if (str.charAt(index) == '-') { result = -result; } } return result; } }
public class Solution { public int StrToInt(String str) { if(str.isEmpty()){ return 0; } int res=0; int len = str.length()-1; int x=1; while(len>=0){ if(str.charAt(len)=='-'){ res = -res; }else if(str.charAt(len)=='+'){ }else if(str.charAt(len)<='9' && str.charAt(len)>='0'){ res = res + (str.charAt(len)-'0')*x; x=x*10; }else{ res=0; break; } len --; } return res; } }
public class Solution { public int StrToInt(String str) { if(str.length() == 0) return 0;//空值 int index = 0; int res = 0; int sign = 1;//记录符号 char[] arr = str.toCharArray();//图方便 //首位可以是 + - 0~9 if(arr[0] == '-'){ sign = -1; index++; } else if(arr[0] == '+'){ index++; } //非法字符 else if(arr[0] > '9' || arr[0] < '0'){ return 0; } //逐位遍历 while(index < arr.length){ if(arr[index] > '9' || arr[index] < '0') return 0; //合法字符 res = (res == 0)? arr[index] - '0' : res*10 + arr[index] - '0'; index++; System.out.println(res); } return sign*res; } }印象中lc是要判断溢出的,提交后发现这里不用,就算了
public int StrToInt(String str) { if(str==null || str.length()==0) return 0; long result =0;// 用long不用考虑数组越界 boolean flag = true;// 结果为正数 if(str.startsWith("-")){ flag = false; str = str.substring(1,str.length()); }else if(str.startsWith("+")){ str = str.substring(1,str.length()); } for(int i=str.length()-1;i>=0;i--){ if(str.charAt(i)<='9'&&str.charAt(i)>='0'){ result +=Math.pow(10,str.length()-i-1)*( str.charAt(i)-'0'); }else{ result=0; break; } } if(!flag) result = -result; return (int) result;// 结果强转为int }
//这个方法可以判断溢出,即数字大于2147483647时,输出0; //或者数字小于-2147483648时,输出0; public int StrToInt(String str) { if (str == null) return 0; int result = 0; boolean negative = false;//是否负数 int i = 0, len = str.length(); /** * limit 默认初始化为 负的 最大正整数 ,假如字符串表示的是正数 * 那么result(在返回之前一直是负数形式)就必须和这个最大正数的负数来比较, * 判断是否溢出 * 注意,int最大值为:2147483647 int最小值为:-2147483648 * 超过该范畴,即为溢出,那么就返回0。 */ int limit = -Integer.MAX_VALUE; //limit = -2147483647 最小的INT型负数是-2147483648,因此无溢出,可以用int表示。 int multmin; int digit; if (len > 0) { char firstChar = str.charAt(0);//首先看第一位 if (firstChar < '0') { // Possible leading "+"&nbs***bsp;"-" if (firstChar == '-') { negative = true; limit = Integer.MIN_VALUE;//在负号的情况下,判断溢出的值就变成了整数的 最小负数了 } else if (firstChar != '+')//第一位不是数字和-只能是+ return 0; if (len == 1) // Cannot have lone "+"&nbs***bsp;"-" return 0; i++; } //limit要么等于-Integer.MAX_VALUE=-2147483647,要么等于Integer.MIN_VALUE=-2147483648。 multmin = limit / 10; //如果结果值是正数,此时multmin为:-214748364;如果是负数,此时multmin为:-214748364。两者相同 while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE digit = str.charAt(i++)-'0';//char转int if (digit < 0 || digit > 9)//0到9以外的数字 return 0; //判断溢出 if (result < multmin) { //假设现在i到了最后一位,i=len-1,假设此时result正好是-214748364 return 0; //如果小于-214748364,即-214748365,-214748366,-2147483657,-2147483658,-2147483659。 //说明待会儿肯定小于-2147483648,肯定溢出,则输出0。注意:这时候最后一位还没加入,接下来开始加入..... } result *= 10;//此时 result = -2147483640 if (result < limit + digit) { //这里相当于 result-digit < limit,判断溢出;为了避免数字溢出导致代码无法执行,因此这样表达 return 0; //溢出 } result -= digit; //经过上面一个if语句的判断,发现不会溢出,那么就将最后一位加入至result } } else { return 0; } //如果是正数就返回-result(result一直是负数) return negative ? result : -result; }