博客
关于我
剑指 Offer 20. 表示数值的字符串
阅读量:134 次
发布时间:2019-02-27

本文共 3865 字,大约阅读时间需要 12 分钟。

表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof


思路:

这就是一道考测试用例的题,一次不可能写成功,得一直改

我遇到的几个奇葩的测试用例摆出来:

测试用例 返回值
" " false
“1.” true
“.1” true
“1.1” true
“.1.” false
“…” false
“2e0” true
“1 4” false
“1e.” false
“G76” false
“±.” false
“-1E-16” true
“6+1” false
“3-2” false
“+.8” true
" -." false
“.44.8” false
“46.e3” true
“6e6.5” false
" 4e3." false
“92e1740e91” false
" 005047e+6" true
“4e+” false

如果这些都能有对应的输出,则基本没有问题


采用分而治之的思想,分别对符号位进行限制,限制哪些情况需要输出false,如果全部通过限制,则返回true

代码如下:

class Solution {       public boolean isNumber(String s) {           s = s.trim();   //去掉首位空格        if (s.length() == 0) return false;        char[] arr = s.toCharArray();        int len = arr.length;        int count = 0;  //记录.的个数        boolean haveE = false;  //记录字符数组中是否有e或E        //循环遍历字符数组        for(int i = 0; i < len; i++) {               //不为符号 和 数字            if(!isnum(arr[i]) && !isnor(arr[i])) return false;            //e,E            if(arr[i] == 'e' || arr[i] == 'E') {                   //如果有过e或E了                if(haveE) return false;                haveE = true;   //变为有e或E                //e的前后位置越界                if(i-1 < 0 || i+1 >= len) {                       return false;                }                //e的前位置不为 数字 .                if(!isnum(arr[i-1]) && arr[i-1]!='.') return false;                //e的后位置不为 数字 - . +                if(!isnum(arr[i+1]) && arr[i+1] != '-' && arr[i-1]!='.' && arr[i+1]!='+') return false;            }            //+            if(arr[i] == '+') {                   //第一位不为+                if(i == 0) continue;                //最后一位为+                if(i == len-1) return false;                //为e或E不执行后面代码                if(arr[i - 1] == 'e' || arr[i - 1] == 'E') continue;                return false;            }            //-            if(arr[i] == '-') {                   //最后为-                if(arr[len-1] == '-') return false;                //-的前不为e和E                if(i-1 >=0 && arr[i-1] != 'e' && arr[i-1] != 'E') {                       return false;                }            }            //.            if(arr[i] == '.') {                   //.在最前                if(i == 0) {                       count++;                    //.后一位越界和不越界                    if(i+1 < len) {                           //.后不为数字                        if(!isnum(arr[i+1])) return false;                        continue;   //不执行后面的代码                    }else {                           return false;                    }                }                //.在最后一位                if(i == len-1) {                       count++;                    //.只能出现一次                    if(count > 1) return false;                    //.前面为符号,且后面越界                    if(isnor(arr[i-1]) && i+1>=len) return false;                    //.的前面有e                    if(haveE) return false;                    continue;   //不执行下面.在中间的代码                }                //.在中间位                count++;                //.的后位置不为数字 e E                if(!isnum(arr[i+1]) && arr[i+1]!='e' && arr[i+1]!='E') return false;                //.的前面有e                if(haveE) return false;                //.只能出现一次                if(count > 1) return false;            }        }        return true;    }    //是否存在数字    public boolean isnum(char en) {           char[] num = {   '0','1','2','3','4','5','6','7','8','9'};        int i;        for(i = 0; i < 10; i++) {               if(en == num[i]) break;        }        return i != 10;    }    //是否存在符号    public boolean isnor(char en) {           char[] num = {   '+','-','e','E','.'};        int i;        for(i = 0; i < num.length; i++) {               if(en == num[i]) break;        }        return i != num.length;    }}

转载地址:http://skxb.baihongyu.com/

你可能感兴趣的文章
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>