題目描述:實(shí)現(xiàn)類似c中atoi()函數(shù)的功能呆躲,將一個(gè)字符串轉(zhuǎn)化為數(shù)字。如字符串'123'轉(zhuǎn)化為123.
需要考慮的問題:
1). 字符串第一位有沒有符號(hào)捶索,即+,-; 這里假設(shè)沒有(如果有符號(hào)插掂,還需要考慮若只有一個(gè)符號(hào)的情況,也應(yīng)該返回0并設(shè)置為非法輸入)
2). 字符串前后有沒有空格腥例;若首尾有空格燥筷,使用strip()函數(shù)去除;去除左側(cè)空格院崇,用lstrip();去除右側(cè)空格,用rstrip()
3). 若輸入字符串為空袍祖,則返回0底瓣;此時(shí)需要考慮,若輸入字符串也為0的情況。
4). 若輸入的字符串越界捐凭,則應(yīng)該將最終的數(shù)字限定在整數(shù)范圍內(nèi)拨扶。
方法1:'123' 轉(zhuǎn)化為數(shù)字,則為 1 * 10^2 + 2 * 10^1 + 3 * 10^0 = 123茁肠,因此可以從字符串后面向前面遍歷患民,從而得到具體的和;
方法二:也可以從前向后遍歷垦梆,當(dāng)遍歷第一個(gè)字符 '1' 時(shí)匹颤,假設(shè)只有這一位數(shù)字,則為數(shù)字 num = 1托猩;再向后遍歷到第二個(gè)字符 '2'印蓖,此時(shí)前面已經(jīng)有一個(gè)數(shù)字 1 了,此時(shí)的數(shù)字應(yīng)為num = num * 10 + 2 = 12;再向后遍歷到第三個(gè)字符 '3'京腥,此時(shí)前面已經(jīng)有數(shù)字num = 12了赦肃,此時(shí)的數(shù)字應(yīng)為num = num * 10 + 3 = 12 * 10 + 3 = 123.
對(duì)應(yīng)的代碼如下:
方法一對(duì)應(yīng)的代碼:
# stringToInt_1.py
def stringToInt_1(inputStr):
# 定義一個(gè)全局變量status,若輸入字符串為'0'公浪,則返回?cái)?shù)字0他宛,并且status置為true;若輸入字符串為空欠气,則返回?cái)?shù)字0厅各,且status置為false
status = True
if inputStr == "":
status = False
return 0, status
inputStr.strip()
num = 0
j = 0
for i in range(len(inputStr) - 1, -1, -1):
if inputStr[i] >= '0' and inputStr[i] <= '9':
num += (ord(inputStr[i]) - ord('0')) * (10 ** j)
j += 1
else: #若遇到'0'-'9'之外的字符,num設(shè)置為0晃琳,且直接退出
status = False
num = 0
break
if num > 2**32 - 1: #若轉(zhuǎn)換后的數(shù)字越界讯检,則應(yīng)該將轉(zhuǎn)換后的數(shù)字限定為最大值
num = 2**32 - 1
return num, status
if __name__ == "__main__":
inputStr = '123'
num, status = stringToInt_1(inputStr)
print("num = ", num, ", status = ", status)
方法二對(duì)應(yīng)的代碼:
#stringToInt.py
def stringToInt(inputStr):
# 定義一個(gè)全局變量status,若輸入字符串為'0'卫旱,則返回?cái)?shù)字0人灼,并且status置為true;若輸入字符串為空顾翼,則返回?cái)?shù)字0投放,且status置為false
status = True
if inputStr == "":
status = False
return 0, status
inputStr.strip() # 去掉輸入字符串首尾的空格
num = 0
for inputStrs in inputStr:
if inputStrs > '0' and inputStrs < '9':
num = num * 10 + ord(inputStrs) - ord('0') #ord函數(shù)得到字符對(duì)應(yīng)的ASCII碼值
else: #若遇到'0'-'9'之外的字符,num設(shè)置為0适贸,且直接退出
status = False
num = 0
break
if num > 2**32 - 1: #若轉(zhuǎn)換后的數(shù)字越界灸芳,則應(yīng)該將轉(zhuǎn)換后的數(shù)字限定為最大值
num = 2**32 - 1
return num, status
if __name__ == "__main__":
inputStr = '123'
num, status = stringToInt(inputStr)
print("num = ", num, ", status = ", status)