剣指Offer(五十三):数値を表す文字列(C++/Python)

2561 ワード

タイトルの説明
文字列が数値(整数と小数を含む)を表すかどうかを判断するための関数を実装してください.たとえば、文字列「+100」、「5 e 2」、「-123」、「3.1416」および「-1 E-16」は数値を表します.しかし、「12 e」、「1 a 3.14」、「1.2.3」、「+-5」、「12 e+4.3」はそうではありません.
問題を解く構想.
数値を表す文字列はパターン[A][B]][e|EC]に従い、Aは数値の整数部分、Bは数値の小数部分、Cは指数部分であり、同時にAとBは同時に空であってはならない.AとCはいずれも符号化される整数であり、Bは符号化されていない整数である.2つの関数を設定し、scanUndignedIntegerは符号なし整数であるか、scanIntegerは符号付き整数であるかを判断し、A,B,Cの3つの部分をそれぞれ判断する.
C++版
class Solution {
public:
    bool isNumeric(char* str)
    {
        if(str == nullptr)
            return false;
        bool numeric = scanInteger(&str);
        if(*str == '.'){
            ++ str;
            numeric = scanUndignedInteger(&str) || numeric;
        }
        if(*str == 'e' || *str == 'E'){
                ++ str;
                numeric = numeric && scanInteger(&str);
        }
        return numeric && *str == '\0';
    }
    bool scanInteger(char** str){
        if(**str == '+' || **str == '-')
            ++(*str);
        return scanUndignedInteger(str);
    }
    bool scanUndignedInteger(char** str){
        char *before = *str;
        while(**str != '\0' && **str >= '0' && **str <= '9')
            ++(*str);
        return *str > before;
    }
};

Python版
class Solution:
    # s   
    def __init__(self):
        self.flag = True
    def isNumeric(self, s):
        # write code here
        if len(s) == 0:
            return False
        if s[0] != '.':
            cur = self.scanInteger(s, 0)
        else:
            cur = 0
        if cur < len(s) and s[cur] == '.':
            cur += 1
            flag = self.flag
            self.flag = True
            cur = self.scanUnsignedInteger(s, cur)
            self.flag |= flag
        if cur < len(s) and (s[cur] == 'e' or s[cur] == 'E'):
            cur += 1
            cur = self.scanInteger(s, cur)
        return self.flag and cur == len(s)
    def scanInteger(self, s, cur):
        if cur == len(s):
            self.flag = False
        elif s[cur] == '+' or s[cur] == '-':
            cur += 1
        tempcur = self.scanUnsignedInteger(s, cur)
        return tempcur
    def scanUnsignedInteger(self, s, cur):
        temp = cur
        while cur < len(s) and s[cur] >= '0' and s[cur] <= '9':
            cur += 1
        if cur == temp:
            self.flag = False
        return cur