您的位置:首页 > 职场人生

剑指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’。

算法源程序:

/**************************************************************
* 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));
}
}





程序运行结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息