将一个字符串转换成一个整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
返回值描述:
如果是合法的数值表达则返回该数字,否则返回0

示例1:

输入:"+2147483647"
输出:2147483647

示例2:

输入:"1a33"
输出:0

题目链接

https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

解题思路

该题目主要有三个方面要注意:

一是判断第一个字符是否为符号“+” 或 “-”;

二是判断字符串中间是否有非法字符,即非数字(字母);

三是判断是否为空字符串;

 

所以,上来应该先判断是否为空,以及字符串长度是否小于1;

然后将字符串转为字符数组,遍历字符数组,判断是否有非法字符,即判断是否合法;

如果不合法则返回0;如果合法则继续判断首字符是否是符号,如果是正号(“+”)则将标志位flag置为1,如果是负号(“-”)将标志位置为-1;

然后遍历数组, res = 10*res+chs[i]-'0'; 这里注意,从数组里获得的是字符,并不是数字,所以要减去 '0' ,这样得到的才是真正的数字(0-9)。

最后返回标志位flag*res乘积。

----

以上的思路是一个传统的思路,其实,还可以进行优化。

比如,可以把判断是否合法放在计算res结果的这个循环里面,这样就将两次遍历数组减少为只需遍历一次就行。

还可以标志位判断也放在循环里。

代码如下:

public class Solution {
    public int StrToInt(String str) {
        if(str.isEmpty()||str.length()<1)//特别注意这里的判断
            return 0;
        char[] chs = str.toCharArray();
//         if(!isLegal(chs)){
//             return 0;
//         }
        int res = 0;
        /*
        int flag = 1;
        if(chs[0]=='-')
            flag = -1;
        else if(chs[0]=='+')
            flag = 1;
        else 
            res = chs[0]-'0';
            */
        for(int i = 0;i<chs.length; i++){
            if(chs[i]=='-' || chs[i]=='+')
                continue;
            if(chs[i]<'0' || chs[i]>'9')
                return 0;
            res = 10*res+chs[i]-'0';
        }
        return chs[0]=='-'?-res:res;
        
    }
    
  //该函数在这里没有用到,只是为了对比第一种思路;
public boolean isLegal(char[] chs){ for(int i = 0; i<chs.length; i++){ if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z')){ return false; } } return true; } }

 

 

 

Over...

 
 
 
posted @ 2021-02-06 12:26  额是无名小卒儿  阅读(808)  评论(0编辑  收藏  举报