剑指offer——表示数值的字符串

题目描述:请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字、小数和整数)

科学计数法的数字(按顺序)可以分为以下几个部分:

  • 若干空格
  • 一个整数或者小数
  • (可选)一个' e '或者' E ',后面跟着一个整数(可正可负)

小数(按顺序)可以分为以下几个部分:

1、若干空格

2、(可选)一个符号字符(' + '或' - ')

3、可能是以下描述格式之一:

  • 至少一位数字,后面跟着一个点' .  '
  • 至少一位数字,后面跟着一个点' .  ',后面再跟着至少一位数字
  • 一个点' . ',后面跟着至少一位数字

4、若干空格

整数(按顺序)可以分为以下几个部分:

1、若干空格

2、(可选)一个符号字符(' + '或' - ')

3、至少一位数字

4、若干空格

提示:

1、1<=str.length<=25

2、str仅含英文字母(大写和小写),数字(0-9),加号'+'、减号'-'、空格' '、或者点'.'

3、担心用例是不是能表示为数值的,可以使用Python的print(float(str))查看

示例一:

输入:"123.45e+6"

返回值:true

示例二:

输入:"1.2.3"

返回值:false

思路及解答:

 定义几个变量:

hasNum:是否已经有数字

hasE:是否已经有E

hasSign:是否已经有符号

hasDot:是否已经有小数点

首先初始化当前的索引index=0,字符串头部的空格需要跳过

  • 循环判断索引是否在有效的范围内:

循环判断是否是数字,是数字则更新hasNum = true,并且索引后移,直到不是数字的时候,跳出循环。

  • 跳出循环后,需要判断当前的index是否合法,不合法直接break。
  • 取出当前索引的字符'c':

1、如果c是e或者E:

如果前面已经出现过E,或者前面没有数字,直接返回false,否则,hasE置为false,也就是E后面可以继续出现符号数字和小数点了

2、如果c是“+”或者“-”:

前面如果出现过数字或者符号或者小数点,都不是合法的,否则hasSign置为true,表示符号出现过

3、如果c是小数点' . ':

前面如果已经有小数点或者E出现了,那么就是非法的,返回false,否则hasDot置为true

4、如果c为空格,直接跳出循环,否则直接返回false

最后也需要跳过空格,判断是否合法的条件是:是否到达最后一个字符,并且出现过数字。

Java的实现代码如下:

public boolean isNumeric(String str){
    int size = str.length();
    int index = 0;
    //默认全部是false
    boolean hasNum = false,hasE = false,hasSign = false,hasDot = false;
    //跳过空格
    while(index < size && str.charAt(index) == ' '){
        index++;
      }
    while(index < size){
        while(index < size && str.charAt(index) >= '0' && str.charAt(index) <= '9'){
            index++;
            //表示前面有数字
            hasNum= true;
        }
            //到末尾直接跳出
        if(index == size){
            break;    
        }
        char c = str.charAt(index);
        if(c == 'e' || c == 'E'){
            //前面有E或者灭有数字在前面
            if(hasE || !hasNum){
                return false;
            }
            hasE = true;
            //出现了E后面又可以出现数字了
            hasNum = false;
            hasSign = false;
            hasDot = false;
        }else if(c == '+' || c == '-'){
            if(hasSign || hasNunm || hasDot){
                return false;
            }
            hasSign = true;
        }else if(c == '.'){
            if(hasDot || hasE){
                return false;
            }
            hasDot = true;
        }else if(c == ' '){
            break;
        }else{
            return false;
        }
        index++;   
    }
    //跳过空格
    while(index < size && str.charAt(index) == ' '){
        index++;
    }
    return hasNum && index == size;
}

你可能感兴趣的:(剑指offer刷题,算法,leetcode,java,职场和发展,数据结构,intellij-idea)