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


    题目描述

    将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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...

     
     
     
  • 相关阅读:
    搭建Java环境
    【leetcode】257. 二叉树的所有路径
    【leetcode】563. 二叉树的坡度
    【leetcode】401. 二进制手表
    【leetcode】859. 亲密字符串
    【leetcode】1441. 用栈操作构建数组
    【leetcode】1502. 判断能否形成等差数列
    【leetcode】605. 种花问题
    【leetcode】1252. 奇数值单元格的数目
    【leetcode】1640. 能否连接形成数组
  • 原文地址:https://www.cnblogs.com/gjmhome/p/14381148.html
Copyright © 2020-2023  润新知