剣指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++版
Python版
文字列が数値(整数と小数を含む)を表すかどうかを判断するための関数を実装してください.たとえば、文字列「+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