题目描述

  请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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. Kafka消息队列初识

    一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...

  2. 浏览器输入URL到返回页面的全过程

    [问题描述] 在浏览器输入www.baidu.com,然后,浏览器显示相应的百度页面,这个过程究竟发生了什么呢? [第一步,解析域名,找到主机] 正常情况下,浏览器会缓存DNS一段时间,一般2分钟到3 ...

  3. linux装OpenOffice后传---中文乱码的解决

    上一篇的博客已经详细的介绍了linux系统上如何安装OpenOffice,安装之后使用发现转换的pdf出现中文乱码.后来发现是linux上没有中文对应的那个字体. 字体准备 在windows上的位置 ...

  4. pythonday06数据类型(四)

    今日内容 1.集合 2内存相关 1.集合set 无序 无重复 v = {1,2,3,4,5,6,99,100} # 疑问:v = {} """ None int v1 = ...

  5. 创建docker容器遇到的错误

    1.问题截图 2.问题描述 出现该问题就是docker版本和系统版本不兼容导致的. 现在的系统版本和docker的版本如下: 3.问题解决 安装低版本的docker或者高版本的系统(Centos7.4 ...

  6. ES6中。类与继承的方法,以及与ES5中的方法的对比

    // 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...

  7. 本地在不安装Oracle的情况下安装PLSQL客户端

    本文解决问题:   通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...

  8. Kafka 系列(四)—— Kafka 消费者详解

    一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...

  9. Hive 系列(一)—— Hive 简介及核心概念

    一.简介 Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 ...

  10. 性能测试学习第六天-----JMeter拓展应用

    一.TCP取样器 服务器名称或IP:填写socket接口的ip 端口号:写socket接口的端口号 Re-use connection:是否重用链接,如果选择,同一个线程执行的所有请求都会使用一个tc ...