1. 程式人生 > >劍指Offer_53_表示數值的字串

劍指Offer_53_表示數值的字串

題目描述

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示數值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

解題思路

首先判斷是否有符號(+或者-),如果有,則對後面的字串判斷
首先需要掃描數字直到結束或是遇到其他字元,結束則返回true,否則繼續按情況判斷下一個需要判斷的字元
- 如果是小數點’.’,是則掃描數字,直到結束(返回true)或者遇到特殊字元,如果是e或E,那麼對後面的數判斷是否符合指數表示,如果是其他字元則返回false。
- 如果是e或者E,那麼對後面的數判斷是否符合指數表示。
- 如果不符合上面的情況則返回false

指數判斷:
首先判斷是否是符號,如果是,跳到下一位判斷後面的是否是數字組成的串,是則表示指數表示是正確的,否則是不正確的。

實現

public class Solution {
    /**
     * 根據題目要求,正確的輸入格式應該符合以下的形式:
     * [sign]integer-digits[.[fragment-digits]][e|E[sign]exponential-digits]
     * []中的表示不一定需要
     * @param str
     * @return
     */
    public boolean isNumeric(char
[] str) { if (str == null || str.length <= 0) return false; int index = 0; //判斷是否有符號 if(str[index] == '+' || str[index] == '-'){ index++; } //如果只有符號位,則不是正確的數字 if (index == str.length) return false; //掃描數字 index = scanDigits(str
,index); if (index < str.length){ //如果有小數 if (str[index] == '.'){ index++; index = scanDigits(str,index); //如果有指數表示的形式 if (index < str.length){ if (str[index] == 'e' || str[index] == 'E'){ index++; return isExponential(str,index); } return false; } return true; }else if (str[index] == 'e' || str[index] == 'E'){ //如果沒有小數,且有指數形式 index++; return isExponential(str,index); } return false; } return true; } private boolean isExponential(char[] str, int index) { if (index < str.length){ //如果是符號,跳到下一個 if (str[index] == '+' || str[index] == '-'){ index++; } index = scanDigits(str,index); if (index == str.length) return true; return false; } return false; } private int scanDigits(char[] str, int index) { while (index < str.length && str[index] >= '0' && str[index] <= '9') index++; return index; } }