1. 程式人生 > >Leetcode#8. String to Integer (atoi)(字串轉數字)

Leetcode#8. String to Integer (atoi)(字串轉數字)

宣告:題目解法使用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