leetcode day26 字符串

今天的两道题都是字符串转数字相关的,好麻烦,条件总是考虑不全

剑指 Offer 20. 表示数值的字符串

思路:主要是条件要考虑全

        '.'出现的正确情况:只出现一次,且'.'出现的时候e还没出现

        ‘e’出现的正确情况:只出现一次,且e出现前要有数字出现

        '+/-'出现的正确情况:只能在开头,或者紧接着e出现

注意:代码最后return numFlag。首先不管哪种情况,都需要有数字出现,没有数字肯定不对;其次对于出现e的情况,接收到e时,前面必定已有数字出现,此时将numFlag重置,意味着接收到e后,如果后面没有数字,也是错误结果。(必须以num结尾)

public boolean isNumber(String s) {
        if (s == null || s.length()==0)
            return false;
        s = s.trim();//去掉空格
        boolean numFlag = false;//是否出现数字
        boolean dotFlag = false;//是否出现点
        boolean eFlag = false; //是否出现e
        for (int i=0;i<s.length();i++){
            // 出现数字
            if (s.charAt(i)>='0' && s.charAt(i)<='9'){
                numFlag = true;
            }else if (s.charAt(i)=='.' && !dotFlag && !eFlag){
                // 出现. 要求此前没出现过. 和 e
                dotFlag = true;
            }else if ((s.charAt(i)=='e' || s.charAt(i) == 'E') && !eFlag && numFlag){
                // 出现e,需要此前没出现过e 并且出现过数字
                eFlag = true;
                numFlag = false; // 为了避免123e这种情况,出现e后的标志为false
            }else if ((s.charAt(i)=='+' || s.charAt(i)=='-') && (i == 0 || s.charAt(i-1)=='e' || s.charAt(i-1)=='E')){
                //出现+/-
            }else{
                // 其他情况都非法
                return false;
            }
        }
        return numFlag;
    }

面试题67. 把字符串转换成整数

思路:也是想好所有情况。如果以“+/-”开头,注意要对结果加上正负符号,且要注意计算过程中的越界问题;如果以数字开头,直接计算结果就行;如果其他字符开头,直接返回0。

public int strToInt(String str) {
        str = str.trim();
        if (str == null || str.length() == 0)
            return 0;
        boolean isMinus = false;//记录是否是负数
        char[] ch = str.toCharArray();
        if (ch[0]=='+' || ch[0]=='-' ||Character.isDigit(ch[0])){
            // 是否正负号开头
            if (ch[0] == '+' || ch[0]=='-'){
                if (ch[0] == '-'){
                    isMinus = true;
                }
                // 删除首位
                ch = Arrays.copyOfRange(ch,1,ch.length);
            }
            int index = 0;
            long res = 0;//注意结果用long型存储
            while (index<ch.length && Character.isDigit(ch[index])){
                res = res*10+(ch[index]-'0');
                if (res > Integer.MAX_VALUE){
                    return isMinus?Integer.MIN_VALUE:Integer.MAX_VALUE;//正或负
                }
                index++;
            }
            return isMinus?-(int)res:(int)res;
        }
        // 不是数字或+-开头
        return 0;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值