将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
数据范围:字符串长度满足
进阶:空间复杂度
,时间复杂度 %20%5C)
进阶:空间复杂度
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
"+2147483647"
2147483647
"1a33"
0
# -*- coding:utf-8 -*- class Solution: def StrToInt(self, s): # write code here if not s or s == '': return 0 temple = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-'] flag = 1 num = 0 for i in range(len(s)): if s[i] in temple: if s[i] == '+': if i == 0: flag = 1 else: return 0 elif s[i] == '-': if i == 0: flag = -1 else: return 0 else: num = num * 10 + temple.index(s[i]) else: return 0 #处理溢出: 整数范围 [-0x80000000, 0x7fffffff] if (flag == 1 and num > 0x7fffffff) or (flag == -1 and num > 0x80000000): return 0 else: return flag * num
/**
* 把字符串转成整数
* 题目描述
* 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
* 数值为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;
}
};