剑指 Offer 20. 表示数值的字符串(详细版+leetcode测试用例+双99%源码)

在这里插入图片描述
本题思路不难,就是需要注意细节,各种恶心的测试用例都有涉及。需要注意如下几点:
1.±号只能出现在数字最开始或者e/E后面,不能出现在数字之间。
2.空格只能出现在字符串的开头和结尾,中间的空格是不允许的。
3.’.‘只能出现在e/E之前,不能出现在其后面。
4.e/E出现在数字后面,且不能出现在结尾。
5.最后一个非空格字符只能是数字或者’.’。
6.整个字符串必须包含数字。

本题我被坑的测试用例在此做个总结,以免后人多次提交:
“e9”、“1 “、” “、”.1”、“3.”、"."、". 1"、“1 4”、" 0"、“1 .”、“0e “、“6+1”、”.-4”、"+ 1"

class Solution {
    public boolean isNumber(String s) {
        char[] arr = s.toCharArray();
        int index = 0;
        int len = s.length();
        boolean flag = false;//记录+-号的出现
        int flag_E = 0;//记录e/E的出现
        int flag_point = 0;//记录.的出现
        boolean flag_num = false;//记录数字是否出现过
        boolean flag_blank = false;//记录有害空格是否出现过
        int last=0;//记录最后一个非空元素的索引
        while(index<len){
            if(!flag && (arr[index]=='-'||arr[index]=='+')){
                //flag为false时,+-才能合法出现。出现在开头或者e/E后面都是合法的
                flag = true;
            }else if(!flag_blank && arr[index]<='9'&&arr[index]>='0'){
                //在数字前面不能有有害的空格出现,有害的空格指的是数字字符串中间部分的空格
                flag_num=true;
                flag = true;
            }else if(!flag_blank && flag_num && (arr[index]=='e'||arr[index]=='E')){
                //出现e/E前面不能有有害空格且必须有数字
                flag = false;
                flag_E++;
            }else if(!flag_blank && flag_E==0 && arr[index]=='.'){
                //出现.前面不能有有害空格,并且不能出现e/E
                flag_point++;
                flag = true;
            }else if(arr[index]==' '){
                if(flag_num || flag_E>0 || flag_point>0 || flag){
                    //开头的空格和结尾的空格不进行计算,只有当+/-、数字、e/E、.出现后才进行记录
                    flag_blank = true;
                    last--;//如果是结尾的空格,则将last--
                }
            }else{
                return false;
            }
            last++;
            index++;
            if(flag_E>1||flag_point>1) return false;//e/E和.至多出现一次
        }
        if(!flag_num)return false;//如果没有出现数字,则返回false
        if(arr[last-1]=='.' || (arr[last-1]>='0' && arr[last-1]<='9'))return true;
        //如果最后一个字符为.或者数字,则返回true。否则返回false,比如最后一个字符为e/E
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郁同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值