剑指Offer面试题54:表示数值的字符串
2016-10-12 22:27
645 查看
题目:表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”,“5e2”,"-123","3.1416",
"-1e-16"都表示数值,但“12e", "1a3.14" ,"1.2.3", "+-5"都不是。
算法分析:
在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。
判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。另外,如果是用科学计数法表示的数值,在整数或者小数的后面还有可能遇到’e’或者’E’。
算法源程序:
程序运行结果:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”,“5e2”,"-123","3.1416",
"-1e-16"都表示数值,但“12e", "1a3.14" ,"1.2.3", "+-5"都不是。
算法分析:
在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。
判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。另外,如果是用科学计数法表示的数值,在整数或者小数的后面还有可能遇到’e’或者’E’。
算法源程序:
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:表示数值的字符串 * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”,“5e2”,"-123","3.1416", "-1e-16" * 都表示数值,但“12e", "1a3.14" ,"1.2.3", "+-5"都不是。 * 输入描述: 请输入一个要判断的字符串: * -12E-16 * 程序输出:算法1的判断的结果是:true * 算法2的判断结果是:true * 问题分析: 1.整个字符串不需要从头循环到尾,只需要一次次向后移动所指向的字符即可 * 算法描述:在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。 * 如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。 * 如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。 * 判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符, * 继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。 * 另外,如果是用科学计数法表示的数值,在整数或者小数的后面还有可能遇到’e’或者’E’。 * 完成日期:2016-10-12 ***************************************************************/ package org.marsguo.offerproject54; import java.util.Scanner; class SolutionMethod1{ public boolean isNumberFunction(String input){ if(input == null || input.length() < 1){ return false; } int i = 0; //用于指向字符串中的每一个字符 int len = input.length(); //用于判断字符串的长度 //判断字符串的第一位是不是正负号 if(input.charAt(i)== '+'||input.charAt(i) == '-'){ i++; //后移一位 } //已经到达了字符串的结尾,每次i后移后都需要判断是否超出了字符串的长度 if(i >= len ) return false; boolean index = true; i = scanDigits(input, i); //还没有到达字符串的末尾 if(i <len){ //如果是小数点 if(input.charAt(i) == '.'){ i++; i = scanDigits(input, i); //已经到达了字符串的末尾了 if(i >= len){ return true; } else if(input.charAt(i) == 'e' || input.charAt(i) == 'E'){ index = isExponential(input,i); } else{ index = false; } } //如果是指数 else if(input.charAt(i) == 'e' || input.charAt(i) == 'E'){ index = isExponential(input,i); } else { index = false; } return index; } //已经到达了字符串的末尾,说明其没有指数,整个字符串都循环完 else{ return true; } } public int scanDigits(String input,int i){ //循环扫描,直到所指的字符不是数字为止 while(i <input.length() && input.charAt(i) >= '0'&& input.charAt(i) <= '9'){ i++; } return i; } public boolean isExponential(String input,int i){ if(input.charAt(i) != 'e' && input.charAt(i) != 'E') return false; i++; if(i >= input.length()) //每一次i++后,都要判断下是否已经到达了字符串的结尾 return false; if(input.charAt(i) == '+' || input.charAt(i) == '-') i++; if(i >= input.length()) return false; i = scanDigits(input, i); return (i >= input.length())? true:false; } } class SolutionMethod2{ public boolean isNumeric(String input){ //如果只输入一个+-的话,会判断为true,是个bug return input.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?"); } } public class IsNumber { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("请输入一个要判断的字符串:"); String str = scanner.nextLine(); scanner.close(); SolutionMethod1 solution1 = new SolutionMethod1(); System.out.println("算法1的判断的结果是:" + solution1.isNumberFunction(str)); SolutionMethod2 solution2 = new SolutionMethod2(); System.out.println("算法2的判断结果是:" + solution2.isNumeric(str)); } }
程序运行结果:
相关文章推荐
- 剑指offer——面试题54:表示数值的字符串
- 剑指offer--面试题54:表示数值的字符串
- 【剑指Offer学习】【面试题54:表示数值的字符串】
- 【剑指Offer】面试题54:表示数值的字符串
- 剑指offer——面试题54:表示数值的字符串
- 剑指offer-面试题54-表示数值的字符串
- 剑指offer-面试题54:表示数值的字符串
- 剑指Offer 面试题20:表示数值的字符串 Java代码实现
- 剑指offer--面试题20:表示数值的字符串
- 【剑指offer】面试题20:表示数值的字符串
- 剑指offer54 表示数值的字符串
- 剑指offer面试题54 表示数字的字符串(java实现)
- 剑指offer(56):表示数值的字符串
- 剑指offer-----判断字符串是否表示数值(java版)
- 《剑指Offer》学习笔记--面试题54:表示数值的字符串
- 剑指offer-53.表示数值的字符串
- 剑指offer——表示数值的字符串(好题)(了解下库函数和正则)
- 剑指offer(50)-表示数值的字符串
- 【剑指offer-解题系列(53)】表示数值的字符串
- 面试题54:表示数值的字符串