【Offer】[20] 【表示数值的字符串】
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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 都不符合)
测试用例
- 功能测试(正负数;含整数与不含整数部分;含与不含小数部分;含与不含指数部分;不匹配情况)
- 特殊测试(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】[20] 【表示数值的字符串】的更多相关文章
- 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机
剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...
- 【Java】 剑指offer(20) 表示数值的字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...
- 剑指 Offer 20. 表示数值的字符串
方法:分为几个部分判断 DA[.B][E/eC] D 其中D表示前后的空格,需要处理,跳过即可 A可以带正负号 有符号数 B无符号数 C可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...
- 【剑指offer】面试题 20. 表示数值的字符串
面试题 20. 表示数值的字符串
- 剑指offer——22表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 《剑指offer》面试题20. 表示数值的字符串
问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...
- Go语言实现:【剑指offer】表示数值的字符串
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2",&qu ...
- 剑指Offer 53. 表示数值的字符串 (字符串)
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 《剑指offer》-表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...
- [剑指Offer] 53.表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
随机推荐
- awk文本处理
一.前言 (一).awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理,数据可以来自标准输入.一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进 ...
- 让 CXK 来教你实现游戏中的帧动画(上)
一款游戏除了基本功能之外,还需要给玩家更多视觉上的刺激,这个时候就需要用特效来装饰.本文就将介绍 Cocos Creator 的动画系统,除了标准的位移.旋转.缩放动画和序列帧动画以外,这套动画系统还 ...
- 【Java例题】2.1复数类
1.定义复数类,包括实部和虚部变量.构造方法. 加减乘除方法.求绝对值方法和显示实部.虚部值的方法. 然后编写一个主类,在其主方法中通过定义两个复数对象来 显示每一个复数的实部值.虚部值和绝对值, 显 ...
- 4、一个打了鸡血的for循环(增强型for循环)
对于循环,我们大家应该都不陌生,例如do-while循环,while循环,for循环,今天给大家介绍一个有趣的东西——打了鸡血的for循环(增强型for循环). 首先看代码,了解一下for循环的结构: ...
- Javasrcipt中从一个url或者从一个字符串中获取参数值得方法
从url中获取参数值是che程序开发过程中的常用需求,偶然得闲,便抽空研究了一下javasrcipt下,获取参数的办法(JAVA中也类似). 首先看url的规范: URL组成:protocol :// ...
- 你真的了JMeter解聚合报告么?
1.背景 大家在使用JMeter进行性能测试时,聚合报告(Aggregate Report)可以说是必用的监听器,但是你真的了解聚合报告么? 2.目的 本次笔者跟大家聊聊聚合报告(Aggregate ...
- js-获取屏幕的中各种宽高
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- C#使用NLOG System.TypeInitializationException,类型初始值设定项引发异常
C#如何使用NLOG,网上有很多介绍,本次使用时遇到一个问题,使用NLOG写日志时,出现初始化异常,基本异常信息如下: System.AggregateException: 发生一个或多个错误. -- ...
- 【redis】redis应用场景,缓存的各种问题
如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 缓存 redis还有另外一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下 ...
- JS 一些有意思的写法
对于 C语言中的 &&(有一个为假,返回的为false) 和 || (有一个为真,即为真),但是对于 JS中的 && 和 || 运算是有所不同的. 详情见下面: &am ...