题目描述

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

思路分析

  根据《剑指Offer》中使用A.Be/EA的模式,A部分表示带符号整数,B部分表示无符号整数,需要自己写出判断 是否是整数的方法,设置一个全局的索引index,先判断A部分,经过小数点 之后在判断B部分,经过e/E之后,在判断A是否是带符号整数。要注意的地方:

  • 小数点之前可以没有整数部分(.123 符合)
  • 小数点之后也可以没有小数部分(134. 也符合)
  • e/E之前和之后 没有数字时不能表示数字,(.e1 ,12e 都不符合)

测试用例

  1. 功能测试(正负数;含整数与不含整数部分;含与不含小数部分;含与不含指数部分;不匹配情况)
  2. 特殊测试(null,空字符串)

Java代码

public class Offer20 {
public static void main(String[] args) {
System.out.println("****功能测试****");
test1();
System.out.println("****特殊值测试****");
test2();
}
public static boolean isNumeric(char[] str) {
return Solution1(str);
}
private static int index = 0;// 用于记录全局索引 /**
* A.B E/e A A为带符号整数 B为无符号整数
*
* @param str
* @return
*/
private static boolean Solution1(char[] str) {
if (str.length == 0 || str == null) {
return false;
}
boolean numeric = scanInteger(str);// 判断A部分 是否是带符号整数 if (index < str.length && str[index] == '.') {// 判断B部分
index++;
/**
* 注意这里用的是或,首先 如果可以走到这个判断里,
* 就说明前面A部分中不可能出现+1-9之外的其他字符,例如+2342aa.5进入不到这个判断里
* 那么, 小数可以没有整数部分 ,如: .123
* 小数点后面可以没有数字,如: 123.
* 当前小数点前后可以都有数字,如:123.422
*
*/
numeric = scanUnsignedInteger(str) || numeric;
} if (index < str.length && (str[index] == 'e' || str[index] == 'E')) {
index++;
/**
* 当e/E前面没有数字时,不能表示数字如.el、el
* 后面没有数字时,不能表示数字,如 12e、12e+5.4
*/
numeric = numeric && scanInteger(str);
}
if(numeric && index == str.length) {
return true;
}
return false;
} private static boolean scanUnsignedInteger(char[] str) {
int start = index;
while (index < str.length && (str[index] - '0' >= 0 && str[index] - '0' <= 9 )) {
index++;
}
if (index > start) {
return true;
}
return false;
}
private static boolean scanInteger(char[] str) {
if (index < str.length && (str[index] == '+' || str[index] == '-')) {
index++;
}
return scanUnsignedInteger(str);
} /**
* 功能测试
*/
private static void test1() {
boolean numeric = isNumeric("+272.".toCharArray());
System.out.println("+272.-->"+numeric);
boolean numeric2 = isNumeric("+272.89E+87".toCharArray());
System.out.println("+272.89E+87-->"+numeric2);
boolean numeric3 = isNumeric("+272.89E+87".toCharArray());
System.out.println("+272.8.9E+87-->"+numeric3);
} /**
* 特殊值输入测试
*/
private static void test2() {
char[] str = {};
boolean numeric = isNumeric(str);
System.out.println("{}"+numeric); }
}

代码链接

剑指Offer代码-Java

【Offer】[20] 【表示数值的字符串】的更多相关文章

  1. 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机

    剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...

  2. 【Java】 剑指offer(20) 表示数值的字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...

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

    方法:分为几个部分判断 DA[.B][E/eC] D 其中D表示前后的空格,需要处理,跳过即可 A可以带正负号 有符号数 B无符号数 C可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...

  4. 【剑指offer】面试题 20. 表示数值的字符串

    面试题 20. 表示数值的字符串

  5. 剑指offer——22表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  6. 《剑指offer》面试题20. 表示数值的字符串

    问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...

  7. Go语言实现:【剑指offer】表示数值的字符串

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2",&qu ...

  8. 剑指Offer 53. 表示数值的字符串 (字符串)

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  9. 《剑指offer》-表示数值的字符串

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...

  10. [剑指Offer] 53.表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

随机推荐

  1. Qt Socket 收发图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  2. JAVA基础——Switch条件语句

    JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...

  3. 【kafka】一、消息队列

    在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞.例如,大量的插入.更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常” 的错误.因此 ...

  4. 02.Mybatis的动态代理方式实现增删改查

    动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...

  5. 【KakaJSON手册】04_JSON转Model_04_值过滤

    在KakaJSON手册的第2篇文章中提过:由于JSON格式能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型 比如客户端想要的是Date类型,服务器返回的 ...

  6. Cause: java.lang.NumberFormatException: For input string: "D"

    异常:Cause: java.lang.NumberFormatException: For input string: "D" 问题回显: 原因分析:'D'只有1位,被认为是ch ...

  7. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  8. 原生js实现分页功能

    原生就是实现分页功能 代码如下: var pagination = function(option,fun){ this.parentId = option.id; //容器 this.pageSiz ...

  9. 快速了解Python并发编程的工程实现(上)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  10. Java网络编程与NIO详解8:浅析mmap和Direct Buffer

    微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...