首页 > 试题广场 >

把字符串转换成整数

[编程题]把字符串转换成整数
  • 热度指数:507899 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度

注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述:
输入一个字符串,包括数字字母符号,可以为空


输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1

输入

"+2147483647"

输出

2147483647
示例2

输入

"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;
            }
        }
    }

}
发表于 2018-02-17 08:36:23 回复(2)
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. 溢出处理

发表于 2017-05-12 10:12:07 回复(7)
#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")

发表于 2016-12-08 11:01:28 回复(5)
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;
    }
}

编辑于 2018-08-08 13:50:05 回复(0)
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;
    }
};

编辑于 2017-07-24 15:20:50 回复(0)
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);
	}
}

发表于 2016-08-28 21:33:11 回复(1)
用long存储 强转之前判断是否溢出 没溢出 强转 溢出 返回0
    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;
    }


发表于 2020-03-10 23:17:56 回复(0)
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;
    }
};

发表于 2016-07-17 11:03:47 回复(0)
看了高票的好些答案
感觉溢出写的不是很好
做了一些改进应该比较清晰明了


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;
    }
}

发表于 2019-11-27 15:34:57 回复(4)

python solution

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        try:
            return int(s)
        except:
            return 0
发表于 2017-10-07 17:23:20 回复(21)
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;
    }
}

发表于 2018-08-11 17:16:57 回复(4)
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;
        
    }
    
    
}





发表于 2016-12-11 22:17:54 回复(3)
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;
    }
}

发表于 2020-02-23 10:43:01 回复(0)
//测试样例不全,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;
    }
};

发表于 2017-06-07 14:22:41 回复(3)
其实非常简单,代码如下:

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;
}

发表于 2016-12-31 13:59:20 回复(2)
/*
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;
}

发表于 2016-05-18 16:20:37 回复(1)
Ron头像 Ron
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;
    }
}

发表于 2015-07-11 12:16:09 回复(1)
    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;
    }

比较笨的方法

发表于 2016-06-11 09:49:47 回复(1)
/*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;
    }
    
};

发表于 2016-03-25 21:02:07 回复(0)
我感觉他给的参考答案有点问题,比如连续多个负号的情况public class Solution {
 
public class Solution {
    public int StrToInt(String str) {
       if(str.equals("")||str.length()==0){
return 0;}
        char []strings=str.toCharArray();
        int fuhao=0;
        if(strings[0]=='-'){
            fuhao=1;
        }
        int sum=0;
        for(int i=fuhao;i<str.length();i++){
              if (strings[i] == '+')
                continue;
            if(strings[i]=='-'){
                if(fuhao==1){
                    fuhao=0;
                }else{
                    fuhao=1;
                }
                
            }
            else if(strings[i]<48||strings[i]>57){
                return 0;
            }
            sum=sum*10+(strings[i]-48);
        }
        return fuhao==0?sum:sum*(-1);
    }
}

发表于 2017-11-06 15:13:39 回复(0)