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

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

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

思路

找出有以下几种情况不满足:

  1. 如果为·.·号并且.号出现次数大于1或者E、e的位置在该.号的前面返回false
  2. 如果e和E在第一个或者最后一个返回false
  3. 如果为+、-号并且不是第一个字符的加减号的话需要满足+、-只能在e、E后面,否则返回false
  4. 如果是非数字字符需要判断是否是+/-/./e/E,如果都不是返回false

其他情况就是true

我们循环判断这四条,需要用一个变量记录.号出现的次数,超过1次返回false,命名为dotCount;用一个变量保存e或者E的位置,e或者E不能出现在.号的前面,命名为ePosition,当遇到.号时判断,如果ePosition<=当前位置,返回false。

代码

  • 优化前
public boolean isNumeric(char[] str){
        if(str.length<=0) return false;
        int ePosition = Integer.MAX_VALUE;
        int dotCount=  0;
        for(int i=0;i<str.length;i++){
            if(str[i]=='e'||str[i]=='E') ePosition = i;
            if(str[i]=='.') dotCount++;
            if((str[i]=='e'||str[i]=='E')&&(i==0||i==str.length-1)) return false;
            else if((str[i]=='+'||str[i]=='-')&&i>=1&&(str[i-1]!='e'&&str[i-1]!='E')) return false;
            else if((str[i]<48||str[i]>57)&&str[i]!='e'&&str[i]!='E'&&str[i]!='.'&&str[i]!='+'&&str[i]!='-') return false;
            else if(str[i]=='.'&&(dotCount>1||ePosition<=i)) return false;
        }
        return true;
    }

判断比较多,下面我们优化一下

  • 优化后

把公共的判断部分合并,减少判断次数,缩短时间复杂度

public class Solution {
    public boolean isNumeric(char[] str) {
        if(str.length<=0) return false;
        int ePosition = Integer.MAX_VALUE;//e和E的位置
        int dotCount=  0;//.号出现的次数
        for(int i=0;i<str.length;i++){
            if(str[i]=='.') {
                dotCount++;//每一次是.就累加次数
                if(dotCount>1||ePosition<=i) return false;//如果为.号并且.号出现次数大于1或者E、e的位置在该.号的前面返回false
            }else if(str[i]=='e'||str[i]=='E') {
                ePosition = i;//保存e和E位置
                if(i==0||i==str.length-1) return false;//如果e和E在第一个或者最后一个返回false
            }
            //如果为+、-号并且不是第一个字符的加减号的话需要满足+、-只能在e、E后面,否则返回false
            else if((str[i]=='+'||str[i]=='-')&&i>=1&&(str[i-1]!='e'&&str[i-1]!='E')) return false;
            //如果是非数字字符需要判断是否是+/-/./e/E,如果都不是返回false
            else if((str[i]<48||str[i]>57)&&str[i]!='e'&&str[i]!='E'&&str[i]!='.'&&str[i]!='+'&&str[i]!='-') return false;
        }
        return true;
    }
}
  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/string-rep-int.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!