劍指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