Leetcode#8. String to Integer (atoi)(字串轉數字)
阿新 • • 發佈:2019-02-10
宣告:題目解法使用c++和Python兩種,重點側重在於解題思路和如何將c++程式碼轉換為python程式碼。
題目
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
題意
實現atoi將字串轉換為整數。
提示:仔細考慮所有可能的輸入案例。如果你想要一個挑戰,請不要在下面看到,問自己什麼是可能的輸入案例。
注意: 這個問題的目的是模糊地指定(即沒有給定的輸入規範)。您有責任收集所有的輸入要求。
分析
題目說你需要自己想象可能的輸入資料,下面是我分析可能的輸入資料以及提交輸出得到的測試陣列範圍:
- 前面可能有空格不影響結果。
input:" 012"
output:12
- 第一個數字前面有下面三種情況:
- ”+”/”-“: 只有其中一個且個數為1為合法。
- “空格/無”:合法。
- “小寫字元”:不合法之前返回0。
- 數字必須連著的,中間出現不合法字元,輸出前面的數字。
input:" 012b34"
output:12
- 字元組成的數字超過int最大值,輸出最大值,超出最小值輸出最小值。
思路
我的思路是先找出第一個出現“+”/“-”/數字的下標記為start(如果在出現+/-/數字之前有字元則直接返回0),此時從start開始遍歷數字有三種情況:
- i ==’+’(i必須為start)
- i == ‘-’ (i必須為start)
- i== 數字(記錄數字出現的位數有多少,int的位數為11位,儘管我們將結果定義為long long int型,但是範圍是有限的,資料可能超出long long int的範圍)
- 其它
C++程式碼
class Solution {
public:
int myAtoi(string str) {
int start;
for(int i=0;i<str.size();i++)
{
if(str[i]>='a'&&str[i]<='z')
return 0;
if(str[i]=='+'||str[i]=='-'||str[i]>='0'&&str[i]<='9')
{
start = i;
break;
}
}
long long int res=0,flag = 1;
int num = 0;
for(int i=start;i<str.size();i++)
{
if(i==start&&str[start]=='-')
flag =-1;
else if(i==start&&str[start]=='+')
flag =1;
else if(str[i]>='0'&&str[i]<='9')
{
num++;
res= res*10 + str[i]-'0';
}
else
break;
}
if((res>=2147483648||num>=11)&&flag==1)
return (2147483647);
if((res>2147483648||num>=11)&&flag==-1)
return (-2147483648);
return res*flag;
}
};
Python程式碼
class Solution(object):
def myAtoi(self, str):
"""
:type str: str
:rtype: int
python字元轉數字:int('2')=2
這裡沒有用到num,是因為python不用定義型別
"""
start = 0
n = len(str)
for i in range(0,n):
if str[i]>='a' and str[i]<='z':
return 0
if str[i]=='+' or str[i]=='-' or (str[i]>='0' and str[i]<='9'):
start = i
break
res = 0
flag = 1
for i in range(start,n):
if i==start and str[start]=='-':
flag = -1
elif i==start and str[start]=='+':
flag = 1
elif str[i]>='0' and str[i]<='9':
res = res * 10 + int(str[i])
else:
break
if res>=2147483648 and flag ==1:
return (2147483647)
if res>2147483648 and flag==-1:
return (-2147483648)
return res*flag