将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
"+2147483647"
2147483647
"1a33"
0
/**
* 把字符串转成整数
* 题目描述
* 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
* 数值为0或者字符串不是一个合法的数值则返回0
* 输入描述:
* 输入一个字符串,包括数字字母符号,可以为空
* 输出描述:
* 如果是合法的数值表达则返回该数字,否则返回0
* 示例1
* 输入
* +2147483647
* 1a33
* 输出
* 2147483647
* 0
*
* @author shijiacheng
* @date 2018/2/17
*/
public class StringToIntSolution {
public int StrToInt(String str) {
if (str.length()==0){
return 0;
}else if (str.length() == 1&&(str.charAt(0)=='-' ||str.charAt(0)=='+' )){
return 0;
}else {
int flag = 0;//1是整数,2是负数
boolean error = false;
char[] chars = str.toCharArray();
int i = 0;
if (chars[0]=='-'){
i++;
flag= 2;
}else if (chars[0]=='+'){
i++;
flag= 1;
}
int result = 0;
for (int j = i; j < chars.length; j++) {
if (chars[j]>='0'&&chars[j]<='9'){
result = result*10+(chars[j]-'0');
}else {
error = true;
break;
}
}
if (!error){
if (flag==2){
result = result*(-1);
}
return result;
}else {
return 0;
}
}
}
}
public class Solution { public int StrToInt(String str) { int res = 0; int symbol = 1; boolean isInvalid = false; // 区分非法输入和0 char[] arr = str.toCharArray(); int n = arr.length; if (n <= 0 || str == null) { isInvalid = true; return 0; } if (arr[0] == '-') symbol = -1; for (int i = (arr[0] == '-' || arr[0] == '+') ? 1 : 0; i < n; ++i) { if (!('0' <= arr[i] && arr[i] <= '9')) { isInvalid = true; return 0; } res = (res << 1) + (res << 3) + (arr[i] & 0xf); //res=res*10+arr[i]-'0' // 溢出判断 if((symbol == 1 && res>Integer.MAX_VALUE) || (symbol == -1 && res < Integer.MIN_VALUE)) { isInvalid = true; return 0; } } return res * symbol; } } 要点: 1. 异常输入和0输入的区分,设置一个全局变量 2. 正负号的处理 3. 溢出处理
#Python版 #思路:需判断一下首字母是否为+,- # -*- coding:utf-8 -*- class Solution: def StrToInt(self, s): # write code here if s is None: return 0 lens = len(s) if lens ==0: return 0 res = 0 strat = 0 flag = 1 if s[0] == '+' or s[0] =='-': strat = 1 if s[0] == '-': flag = -1 for i in range(strat,lens): if '0'<=s[i] and s[i] <= '9': res = res*10+(ord(s[i])-ord('0')) else: return 0 if flag ==-1: res = -res return res print Solution().StrToInt("1a33")
public class Solution { public int StrToInt(String str) { int res = 0; //合法检测 if (!str.matches("\\+{0,1}\\-{0,1}[0-9]{1,}")) return res; int len = str.length(); for (int i = len - 1; i >= (str.charAt(0) == '-' || str.charAt(0) == '+' ? 1 : 0); i--) { res += (int) Math.pow(10, (len - 1 - i)) * (str.charAt(i) - '0'); } return str.charAt(0) == '-' ? -res : res; } }
class Solution { public: int StrToInt(string str) { int m=str.length(); if(m==0) return 0; int result=0,flag=1; int index=str.find_first_not_of(' '); if(str[index]=='+' || str[index]=='-') flag = str[index++]=='-'? -1 : 1; for(;index<m;index++) { if(str[index]>='0' && str[index]<='9') { result = result*10+(str[index]-'0'); if(result*flag > INT_MAX) return INT_MAX; if(result*flag < INT_MIN) return INT_MIN; } else { result = 0; break; } } return result*flag; } };
public class Solution { public int StrToInt(String str) { if (str == null || "".equals(str)) return 0; int len = str.length(); if (len == 1 && !isNumChar(str.charAt(0))) return 0; //保存数值对应的字符 char[] numChars = new char[len]; int res = 0; int index = 0; char sign = '+';//保存符号 boolean isValid = true; for (int i = 0; i < len; i++) { char c = str.charAt(i); if (i == 0 && (c == '-' || c == '+')) { sign = c; continue; } if (isNumChar(c)) { numChars[index++] = c; } else { isValid = false; break; } } if (!isValid) { return 0; } for (int i = 0; i < index; i++) { res += (numChars[i] - '0') * pow(10, index - i - 1); } return sign == '-' ? 0 - res : res; } /** * 判断一个字符是否是数字 * @param c * @return */ private boolean isNumChar(char c) { return c >= '0' && c <= '9'; } private int pow(int base, int exp) { return (int) Math.pow(base, exp); } }
public int StrToInt(String str) { if (str.length() == 0 ||str == null){ return 0; } long result = 0; for(int i=0;i < str.length();i ++){ char c=str.charAt(i); if(c >= '0' && c <= '9'){ result = result*10 + c-'0'; }else if(result != 0){ return 0; } } result=str.charAt(0)=='-'? -result:result; if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE){ return 0; } return (int)result; }
class Solution { public: int StrToInt(string str) { if(str.length()<=0) return 0; int i; for(i=0;i<str.length();i++) { if(str[i]!=' ') break; } int flag=true; if(str[i]=='+') { flag=true; i++; } if(str[i]=='-') { flag=false; i++; } int temp=0,digit=0; for(int j=i;j<str.length();j++) { if(str[j]<'0'||str[j]>'9') return 0; else if(str[j]>='0'&&str[j]<='9') { digit=str[j]-'0'; if((flag==true&&temp>0x7fffffff)||(flag==false&&temp<(unsigned int)0x80000000)) return 0; temp=temp*10+ digit; } } return (flag==true)?temp:-temp; } };
看了高票的好些答案 感觉溢出写的不是很好 做了一些改进应该比较清晰明了 public class Solution { public int StrToInt(String str) { if(str == null ||str.length()==0 || str.trim().equals("")) return 0; char[] chars = str.trim().toCharArray(); int res=0,flag=1,start=0,tmp=0; if(chars[0] == '-') { flag = -1; start = 1; } if(chars[0] == '+') start=1; for(int i =start;i < chars.length;i++){ if(chars[i]>'9'||chars[i]<'0') return 0; //当前个位数字 int dight = (int)(chars[i]-'0'); tmp = res*10+dight; //判断正数溢出 if(flag ==1 && res*10>Integer.MAX_VALUE - dight) return 0; //判断负数溢出 if(flag == -1 && res*10*flag < Integer.MIN_VALUE + dight) return 0; res = tmp; } return flag* res; } }
public class Solution { public int StrToInt(String str) { boolean isPosotive = true; char[] arr = str.toCharArray(); int sum = 0; for(int i = 0; i < arr.length; i++) { if (arr[i] == '+') { continue; } else if (arr[i] == '-') { isPosotive = false; continue; } else if (arr[i] < '0' || arr[i] > '9') { return 0; } sum = sum * 10 + (int)(arr[i] - '0'); } if (sum == 0) { return 0; } return isPosotive == true ? sum : -sum; } }
public class Solution { //1.字符串为空 //2.只有一个正或负号 //3.整数上下溢出 Integer.MAX_VALUE (2^31-1) Integer.MIN_VALUE(-2^31) public int StrToInt(String str) { if(str == null ||str.length()==0){ return 0; } char[] c=str.toCharArray(); boolean minus = false; int num = 0; int i=0; //数组溢出:下标大于数组长度!比如c.length ==1,当有c[1]出现时则数组溢出 if(c[i]=='+'){ ++i; }else if(c[i]=='-'){ ++i; minus=true; } if(i<c.length){ num = StrToIntCore(c,minus,i); }else{ return num; } return num; } int StrToIntCore(char[] str,boolean minus,int i){ int num = 0; for(int j = i;j<str.length;j++){ if(str[j]>='0'&&str[j]<='9'){ int flag = minus ? -1:1; //str[j]-'0' 是为了把字符转为int数字 num = num*10 + flag*(str[j] - '0'); // if((!minus&&num>Integer.MAX_VALUE)||(minus&&num<Integer.MIN_VALUE)){ num=0; break; } }else{ num = 0; break; } } return num; } }
public class Solution { public int StrToInt(String str) { if(str == null || str.length() == 0) return 0; boolean isNegative = str.charAt(0) == '-'; long ret = 0; for(int i = 0; i < str.length(); i++){ char c = str.charAt(i); if(i == 0 && (c == '+' || c == '-')) continue; if(c < '0' || c > '9') return 0; ret = ret * 10 + (c - '0'); } ret = isNegative? -ret : ret; if(ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) return 0; return (int)ret; } }
//测试样例不全,leetcode上做了很久都不对。 //这里都不知道怎么写的居然对了。。。 class Solution { public: int StrToInt(string str) { long long ret = 0; int sz = str.size(); bool flag = false; for(int i = 0; i < sz ; ++i){ if(str[i]>='0' && str[i]<='9'){ ret = ret*10 + (str[i] - '0'); } else if(str[i]=='-' && i==0){ flag = true; } else if((str[i]<'0' || str[i]>'9') && i!=0) return 0; } if(flag) ret = -ret; return ret; } };
public int StrToInt(String str){ if(null==str||str.length()<1){ return 0; } boolean negativeFlag=false; char[]charArray=str.toCharArray(); if(charArray[0]=='-'){ negativeFlag=true; } int sum=0; for(int i=0;i<charArray.length;++i){ if(i==0&&charArray[i]=='+'||charArray[i]=='-'){ continue; } if(charArray[i]<'0'||charArray[i]>'9'){ return 0; } sum=sum*10+(charArray[i]-'0'); } return negativeFlag?(0-sum):sum; }
/* 1、首先有可能有正负号,也有可能没有 2、当输入字符串中有非数字的时候输出为0; */ int StrToInt(string str) { bool g_InvalidValue = false; if(str.size()<=0) { g_InvalidValue = true; return 0; } int i = 0; int sum = 0; bool isPositive = false; if(str[i]=='-') { isPositive = true; i++; } else if(str[i]=='+') { i++; } while(str[i]) { if(str[i]<='9'&&str[i]>='0') { sum = sum*10+str[i]-'0'+0; } else { g_InvalidValue = true; return 0; } i++; } if(isPositive) sum = -sum; return sum; }
public class Solution { public int StrToInt(String str) { if(str == "" || str == null) return 0; char[] chars = str.toCharArray(); int length = chars.length; boolean negative = false; int limit = -Integer.MAX_VALUE; int i = 0; int digit, multMin; int result = 0; if(length > 0){ char firstChar = chars[0]; if(firstChar < '0'){ //may be '+' or '-' if(firstChar == '-'){ negative = true; limit = Integer.MIN_VALUE; }else if(firstChar != '+'){ return 0; } if(length == 1) //only '+' return 0; i++; } multMin = limit / 10; while(i < length){ digit = Character.digit(chars[i++], 10); if(digit < 0) return 0; if(result < multMin){ return 0; } result *= 10; if(result < limit + digit){ //digit必须放在不等式右侧防止左侧溢出,判断防止最终溢出 return 0; } result -= digit; } }else{ return 0; } return negative? result : -result; } }
public int StrToInt(String str) { if(str.isEmpty()) { return 0; } char[] chars = str.toCharArray(); int sum = 0; int sign = 0; if(chars[0] == '-') { sign = -1; }else if(chars[0] == '+') { sign = 1; }else { sum = (int) ((chars[0] - 48) * Math.pow(10, chars.length-1)); } for(int i = 1;i < chars.length;i++){ if(chars[i] < '1' || chars[i] > '9') { return 0; } sum += (int)((chars[i] - 48) * Math.pow(10, chars.length-i-1)); } if(sign != 0) { sum *= sign; } return sum; }
比较笨的方法
/*1、设置输入合法标志,默认为false,当第一个字符为空或者\0的时候直接诶返回0,输入合法标志为false。反之进入下一步 2、设置符号位,判断是+还是-还是不带符号位,只有为-才置为true,否则均为false。 3、区分除了符号位之外第一位时候合法输入。非法时返回0,输入合法位为false。合法时判断有无越界,若越界返回0,输入 合法位为false,无越界计算num返回,输入合法位为true。 总结:只有在顺利走到字符串尾部的时候输入合法标志位才为true,其余情况均为false。这样就能区分开返回0时究竟是非法 输入还是确实输入的就是0。只有一个+号或-号也被考虑进来了,直接返回0且输入合法标志位为false。 */ class Solution { public: enum Status{kValid = 0,kInvalid}; int g_nStatus = kValid; int StrToInt(string str) { g_nStatus = kInvalid; long long num = 0; int index=0; if((!str.empty())&&str[index]!='\0') { bool minus = false; if(str[index]=='+') index++; else if(str[index]=='-') { index++; minus = true; } if(str[index]!='\0') { int length=str.size(); num = StrToIntCore(str.substr(index,length-index),minus); } } return (int)num; } long long StrToIntCore(const string& digit,bool minus) { long long num=0; int i=0; while(digit[i]!='\0') { //合法情况 //if(digit[i]=='+'||digit[i]=='-') //i++; if(digit[i]>='0'&&digit[i]<='9') { int flag = minus?-1:1; num = num*10+ flag*(digit[i]-'0'); //越界情况 if((!minus&&num>0x7FFFFFFF)||(minus&&num<(signed int)0x80000000)) { num = 0; break; } i++; } else//非法情况 { num = 0; break; } } if(digit[i]=='\0') g_nStatus = kValid; return num; } };