zoukankan      html  css  js  c++  java
  • 剑指offer之字符串是否为数值

    1. 题目

    这是《剑指offer》上的一道题,刚开始觉得这是一道挺简单的题目,后来发现自己太年轻了,考虑的因素太少了,思考了而是分钟还是无从下手,看了作者的思路深深被他折服了,题目如下:

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

    2. 思路

    表示数值的字符串遵循模式 A[.[B]][e|EC] 或者 .B[e|EC],其中 A 为数值的整数部分,B 紧跟着小数点为数值的小数部分,C 紧跟着 'e' 或者 'E' 为数值的指数部分。在消暑利可能没有数值的整数部分。例如,小数 .123 等于 0.123。因此 A 部分不是必需的。如果一个数没有整数部分,那么它的小数部分不能为空。

    上述 A 和 C 都是可能以 '+' 或者 '-' 开头的 0~9 的数位串;B 也是 0~9 的数位串,但前面不能有正负号。

    以表示数值的字符串 "123.45e+6" 为例,"123" 是它的整数部分 A,"45" 是它的小数部分 B,"+6" 是它的指数部分 C。

    判断一个字符串是否符合上述模式,首先应该扫描 0~9 的数位,也就是上面数值中表示整数的 A 部分。如果遇到小数点,则开始扫描数值小数部分 B。如果遇到 'e' 或者 'E',则开始扫描表示数值指数的 C 部分。根据这样的思路,给出参考代码:

    public class Main{
        public boolean isNumeric(char[] str){
            if(str==null)
               return false;
            // 这个数组就一个元素,存储遍历字符串的下标
            int[] index = {0};
            // 先遍历字符串的整数部分
            boolean numeric = scanInteger(str,index);
            // 碰到小数点时,开始遍历 B 部分
            if(index[0]<str.length && str[index[0]]=='.'){
                index[0]++;
                /*
                 * 这里使用 || 的原因
                 * 1. 小数可以没有整数,如 .123 等于 0.123
                 * 2. 小数点后面可以没有数字,如 223. 等于  233.0
                 * 3. 当然,小数点前面和后面都可以有数字,如 2233.444
                 */
                numeric = scanUnsignedInteger(str,index) || numeric;
            }
            // 如果出现 'e' 或者 'E',开始遍历指数部分
            if(index[0]<str.length && (str[index[0]]=='e' || str[index[0]]=='E')){
                index[0]++;
                /*
                 * 这里使用 && 的原因
                 * 1. 当 e 或 E 前面没有数字时,整个字符串不能表示数字,如 .e1、e2。
                 * 2. 当 e 或 E 后面没有整数时,整个字符串不能表示数字,如 23e、23e+5.4
                 */
                numeric = numeric && scanInteger(str,index);
            }
            return index[0]==str.length && numeric;
        }
        
        /*
         * 该函数用来扫描字符串中 0~9 的数位(类似于一个无符号整数),可以用来匹配前面数值
         * 模式中的 B 部分
         */
        private boolean scanInteger(char[] str,int[] index){
            if(index[0]<str.length && (str[index[0]]=='+' || str[index[0]]=='-'))
                index[0]++;
            return scanUnsignedInteger(str,index);
        }
        
        /*
         * 该函数扫描可能以表示正负号的 '+' 或者 '-' 开头的 0~9 的数位(类似于一个有符号整数)
         * 可以用来匹配前面数值模式中的 A 和 C 部分。
         */
        private boolean scanUnsignedInteger(char[] str,int[] index){
            int before = index[0];
            while(index[0]<str.length && str[index[0]]>='0' && str[index[0]]<='9')
                index[0]++;
            return index[0]>before;
        }
    }
    

    更多《剑指offer》的题目以及源代码可以参考我的 github

  • 相关阅读:
    POJ1094查分约束,判断关系是否唯一
    POJ1087DFS+匈牙利或者DINIC
    POJ1087DFS+匈牙利或者DINIC
    #Leetcode# 34. Find First and Last Position of Element in Sorted Array
    #Leetcode# 18. 4Sum
    #Leetcode# 16. 3Sum Closest
    #Leetcode# 15. 3Sum
    #Leetcode# 42. Trapping Rain Water
    #Leetcode# 63. Unique Paths II
    #Leetcode# 62. Unique Paths
  • 原文地址:https://www.cnblogs.com/firepation/p/9592335.html
Copyright © 2011-2022 走看看