54、表示数值的字符串

1、

题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。


例子说明

  例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。 
  

解题思路

  在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。 
  判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。另外,如果是用科学计数法表示的数值,在整数或者小数的后面还有可能遇到’e’或者’E’。

package bishi;
public class isNumeric {

     public static boolean isNumeric(char[] str) {

            /**
            **思路:1、可能是正负号
            **2、然后是可能是整数,整数有多少位
            *3、有“.”是小数,后面接整数,整数有n位
            *4、可能有e或E,后面可接+-,然后是若干位整数
            */

            if(str == null || str.length == 0) {
                return false;
            }
            int i  = 0;
            //判断正负号
            if(str[0] == ‘+‘ || str[0] == ‘-‘){
                i++;
            }
            //是否只有正负号
            if(i == str.length){
                return false;
            }
          //判断是否为整数及整数个数
            boolean isNumeric = true;
            i = isNumber(str, i);

            if(i < str.length){            

                if(str[i] == ‘.‘){//1、是小数

                    i++;
                    i = isNumber(str, i);

                    if(i < str.length &&(str[i] == ‘e‘ || str[i] == ‘E‘)){
                        isNumeric = isExp(str, i);
                    }
                } else if (str[i] == ‘e‘ || str[i] == ‘E‘){//2.是整数
                    isNumeric = isExp(str, i);
                } else{//都不是
                    isNumeric = false;
                }

            }
            return isNumeric;

        }

    private static boolean isExp(char[] str, int i) {
        // TODO Auto-generated method stub
        if(str[i] != ‘e‘ || str[i] != ‘E‘){
            return false;
        }
        i++;
        //可能有+-
        if(str[i] == ‘+‘ || str[i] == ‘-‘){
            i++;
        }
        //只有+-
        if(i == str.length){
            return false;
        }
        //可能有数字
        i = isNumber(str, i);
        if(i == str.length){
            return true;
        }
        return false;
    }

    private static int isNumber(char[] str, int i) {
        // TODO Auto-generated method stub
        while(i < str.length && str[i] >= ‘0‘ && str[i] <=‘9‘ ){
            i++;
        }
        return i;
    }

      public static void main(String[] args) {
            System.out.println(isNumeric("100".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("123.45e+6".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("+500".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("5e2".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("3.1416".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("600.".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("-.123".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("-1E-16".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("100".toCharArray()) + "[" + true + "]");
            System.out.println(isNumeric("1.79769313486232E+308".toCharArray()) + "[" + true + "]");
            System.out.println();

            System.out.println(isNumeric("12e".toCharArray()) + "[" + false + "]");
            System.out.println(isNumeric("1a3.14".toCharArray()) + "[" + false + "]");
            System.out.println(isNumeric("1+23".toCharArray()) + "[" + false + "]");
            System.out.println(isNumeric("1.2.3".toCharArray()) + "[" + false + "]");
            System.out.println(isNumeric("+-5".toCharArray()) + "[" + false + "]");
            System.out.println(isNumeric("12e+5.4".toCharArray()) + "[" + false + "]");
        }

}

http://blog.csdn.net/derrantcm/article/details/46825671
时间: 2024-11-06 03:36:42

54、表示数值的字符串的相关文章

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

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

《剑指offer》表示数值的字符串

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+10

【剑指Offer】表示数值的字符串

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

[剑指offer]Q11:数值的整数次方

pow(base, exponent) 考虑一下几种情况: base = 0, 那么直接返回0 base = 1, 那么直接返回1 exponent = 0, 那么直接返回1, 注意base= 0 exponent = 1, 那么直接返回 base exponent  为正为负 的情况 主要考察的点是将问题缩减,用折半的思想.这个题细节还是很多的,为了便于验证,leetcode上恰好有这个题,建议在线AC一下. def equal(self, a, b): return abs(a - b) <

【剑指offer】二十、字符串的排列

题目描述 输入一个字符串,按照字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 分析:全排列问题属于典型的递归问题,对于递归问题,我们首先要做的是找到递归函数的出口,即递归终止条件,找出f(n)和f(n-1)之间的关系,我们f(n)为将第n个字符插入到n-1个字符的任何一个排列的任意一个位置上.求出所有权排列后再对其进行字典排序. 代码如下所示: 1 import java.util.Ar

剑指offer——54数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入 1,2,3,4,5,6,7,0 输出 7 题解: 这道题有待琢磨... 看到

剑指offer剖析__空格替换字符串问题

问题:在"we are happy"这个字符串中,将所有的空格替换成字符串%20. 分析:如果我们不定义一个新的字符数组,就在原字符数组中进行替换,要将一个字节的空格替换成三个字节的字符数组%20,这会产生数组的越界访问,如果允许我们开辟一个新的空间来存放替换后的字符串,则问题将会变得非常简单. 设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入"%20",否则就复制元字符串上的内容. #include <stdio.h>

剑指Offer解题报告(Java版)——字符串转换为数字 49

? ? 引言 ? ? STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界 ? ? 分析问题 ? ? 如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数 ? ? 然后就是字符串中有可能第一

《剑指Offer》:移除字符串中重复的字符_2

题目 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为abcd, 要求:时间复杂度尽可能小 与上篇博文(http://blog.csdn.net/u010412719/article/details/48086641)不一样的地方是:虽然都是移除字符串中重读的字符,但是这里的要求是时间复杂度尽可能小,对空间没有要求. 思路 思路:要求时间复杂度尽可能小而对空间没有限制,这就需要我们用控件换取时间 /* 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为a

《剑指Offer》:移除字符串中重复的字符

题目: 移除字符串中重复的字符, 如abcadc移除后变为abcd, 注意:可以额外定义一两个变量,但不允许额外开辟一个数组. 思路 这里要求了空间复杂度为O(1),那我们只能用最简单的遍历方法,先让第一个字符与后面的字符一一比较,遇到重复的就把重复的字符用'\0'替换掉,再让第二个字符与右面的字符一一比较,遇到重复的,就把重复的字符用'\0'代替,如此循环,直到最后一个字符,当然同时还要在每次遇到'\0'时(重复字符出现的位置,已被填充为'\0'),将后面的字符移到前面来,替换掉'\0',最后