题目描述

  请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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. Unity经典游戏教程之:是男人就下100层

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  2. Adapter适配器模式--图解设计模式

    第二章: Adapter 模式 Adapter模式分为两种: 1.类适配器模式 2.委托适配器 我看的是<图解设计模式>这本书,这小鬼子说的话真难懂,只能好好看代码理解. 先说适配器模式要 ...

  3. java订单生成工具类

    欢迎来到付宗乐个人博客网站.本个人博客网站提供最新的站长新闻,各种互联网资讯. 还提供个人博客模板,最新最全的java教程,java面试题.在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿 ...

  4. ccf 201809-4 再卖菜

    这题一开始不知道剪枝这种操作,只会傻傻地dfs. 然后dfs递归写80分超时,非递归写70分超时(纳尼?我一直以为非递归算法在时间上会更优秀一些,为什么会这样?!!) 剪一下枝就都能过了 #inclu ...

  5. viewpager+fragment结合

    public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ViewPa ...

  6. docker配置国内镜像地址

    docker的官方镜像站被大天朝强了,今天发现阿里有镜像加速这个功能,目前好像是在公测中,废话不多说,接下来告诉你怎么操作. 点击进入阿里镜像库 https://cr.console.aliyun.c ...

  7. Source Maps简介

    提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件.但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦.不过也不用担心,souce maps将会帮你解决这一问题. Sourc ...

  8. 部分APP无法代理抓包的原因及解决方法

    引言 HTTP应用层的抓包已经成为日常工作测试与调试中的重要一环,最近接触新项目突然之间发现之前的抓包手段都不好使了,顿时模块与模块之间的前端与服务之间的交互都变成了不可见,整个人都好像被蒙住了眼睛. ...

  9. Go-cron定时任务

    1.cron(计划任务) 按照约定的时间,定时的执行特定的任务(job). cron 表达式 表达了这种约定. cron 表达式代表了一个时间集合,使用 6 个空格分隔的字段表示. 秒 分 时 日 月 ...

  10. 记基于docker+gunicorn部署sanic项目遇到的很多很多坑

    前言: 最近有个项目需要上线,是python中sanic网络异步框架写的,并且要求使用docker+nginx来部署项目实现负载均衡,于是乎百度了sanic项目部署,基本上都是基于docker+gun ...