1. 程式人生 > >劍指offer系列(十七)求1+2+3+...+n,不用加減乘除做加法,把字串轉換成整數

劍指offer系列(十七)求1+2+3+...+n,不用加減乘除做加法,把字串轉換成整數

求1+2+3+...+n

題目描述

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。

解題思路:

法一:利用python的特性

法二:用兩個函式,一個遞迴,另一個終止遞迴。如果對n連續進行兩次反運算,那麼非零的n轉換為True,0轉換為False。

利用這一特性終止遞迴,注意考慮測試用例為0的情況。

程式碼:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def Sum_Solution(self, n):
        # write code here
        return sum(list(range(1, n+1)))

法二:

# -*- coding:utf-8 -*-
class Solution:
    def Sum_Solution(self, n):
        # write code here
        return self.sum(n)
    
    def sum0(self, n):
        return 0
    
    def sum(self, n):
        fun ={False: self.sum0, True: self.sum}
        return n+fun[not not n](n-1)

不用加減乘除做加法

題目描述

寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。

解題思路:

法一:用sum函式,但是特別注意sum()求和裡面是個[]列表物件,直接輸入num,num2是不行的

法二:(超時

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num2:
            sum = num1^num2
            carray = (num1 & num2)<<1
            #&,左移一位。相當於求進位
            num1 = sum
            num2 = carray
        return num1

)

首先看十進位制是如何做的: 5+7=12,三步走
        第一步:相加各位的值,不算進位,得到2。
        第二步:計算進位值,得到10. 如果這一步的進位值為0,那麼第一步得到的值就是最終結果。

        第三步:重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。

同樣我們可以用三步走的方式計算二進位制值相加: 5-101,7-111

        第一步:相加各位的值,不算進位,得到010, 二進位制每位相加就相當於各位做異或操作,101^111。

        第二步:計算進位值,得到1010,相當於各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。

       第三步重複上述兩步, 各位相加 010^1010=1000,進位值為100=(010&1010)<<1。繼續重複上述兩步:

       1000^100 = 1100,進位值為0,跳出迴圈,1100為最終結果。

程式碼:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        return sum([num1,num2])

法二:

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num2:
            sum = num1^num2
            carray = (num1 & num2)<<1
            #&,左移一位。相當於求進位
            num1 = sum
            num2 = carray
        return num1

把字串轉換成整數

題目描述

將一個字串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。

輸入描述:

輸入一個字串,包括數字字母符號,可以為空

輸出描述:

如果是合法的數值表達則返回該數字,否則返回0。

解題思路:

法一:int()函式

法二:做一些一些特殊處理,比如 +123,就不合理,123前面不需要+,但是-123就合理,因為這是個負數

程式碼:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        try:
            return int(s)
        except:
            return 0

法二:

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        if not s:
            return 0
        num = []
        numbers = {'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
        for i in s:
            if i in numbers.keys():
                num.append(numbers[i])
            elif i == '+':
                continue
            elif i =='-':
                continue
            else:
                return 0
        ans = 0
        for i in num:
            ans = ans*10+i
        if s[0] == '-':
            ans = 0-ans
        return ans