【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 ...
随机推荐
- Kafka消息队列初识
一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...
- 浏览器输入URL到返回页面的全过程
[问题描述] 在浏览器输入www.baidu.com,然后,浏览器显示相应的百度页面,这个过程究竟发生了什么呢? [第一步,解析域名,找到主机] 正常情况下,浏览器会缓存DNS一段时间,一般2分钟到3 ...
- linux装OpenOffice后传---中文乱码的解决
上一篇的博客已经详细的介绍了linux系统上如何安装OpenOffice,安装之后使用发现转换的pdf出现中文乱码.后来发现是linux上没有中文对应的那个字体. 字体准备 在windows上的位置 ...
- pythonday06数据类型(四)
今日内容 1.集合 2内存相关 1.集合set 无序 无重复 v = {1,2,3,4,5,6,99,100} # 疑问:v = {} """ None int v1 = ...
- 创建docker容器遇到的错误
1.问题截图 2.问题描述 出现该问题就是docker版本和系统版本不兼容导致的. 现在的系统版本和docker的版本如下: 3.问题解决 安装低版本的docker或者高版本的系统(Centos7.4 ...
- ES6中。类与继承的方法,以及与ES5中的方法的对比
// 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...
- 本地在不安装Oracle的情况下安装PLSQL客户端
本文解决问题: 通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...
- Kafka 系列(四)—— Kafka 消费者详解
一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...
- Hive 系列(一)—— Hive 简介及核心概念
一.简介 Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 ...
- 性能测试学习第六天-----JMeter拓展应用
一.TCP取样器 服务器名称或IP:填写socket接口的ip 端口号:写socket接口的端口号 Re-use connection:是否重用链接,如果选择,同一个线程执行的所有请求都会使用一个tc ...