面試題47:不用加減乘除做加法
面試題48:不能被繼承的類
參考:所有offer題目的leetcode鏈結及python實現
github target offer
題目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(a?b:c)。
遞迴呼叫函式;
定義 func 字典,儲存函式名稱。
class
solution
:def
sum_solution
(self, n)
:return self.sumn(n)
defsum0
(self, n)
:return
0# 利用非0值作兩次非運算返回false, 0作兩次非運算返回true
defsumn
(self, n)
:# 儲存函式名稱
fun =
# 此處的fun[not not n] 不能寫作func[not not n-1], 否則測試用例為0的話, 就會無限次迭代
return n + fun[
notnot n]
(n -1)
defsum_solution2
(self, n)
:return n and self.sum_solution2(n -1)
+ n
題目:寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、×、÷四則運算符號。
只能使用二進位制的位運算;
相加即異或運算,01=
1,10
=1,0
0=0,
11=0
0^1=1, 1^0=1, 0^0=0, 1^1=0
01=1,1
0=1,
00=0
,11=
0,可以看出在1+1時未得到正確的結果;
對於1+1可以看成是,兩個二進位制相**「與」**之後,左移一位。只有兩個數都是1的時候,位與得到的結果是1,其餘都是0。
將1、2得到的結果相加,直到不產生進製為止(即2步的結果是全零)。
# 每次對num1進行與操作保證是乙個32位的整形
num1 = temp &
0xffffffff
# 判斷符號位是否為1做處理
if num1 >>
31==
0else num1 -
4294967296
完整**:
# -*- coding:utf-8 -*-
class
solution
:def
add(self, num1, num2):if
not num1:
return num2
ifnot num2:
return num1
while num2 !=0:
temp = num1 ^ num2
num2 =
(num1&num2)
<<
1# 每次對num1進行與操作保證是乙個32位的整形
num1 = temp &
0xffffffff
# 判斷符號位是否為1做處理
return num1 if num1 >>
31==
0else num1 -
4294967296
題目:用c++設計乙個不能被繼承的類。
略。
劍指offer 發散思維能力
求1 2 3 n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 1 解法一 python函式 coding utf 8 class solution def sum solution self,n write code here r...
劍指Offer 發散思維能力
不用加減乘除做加法 求1 2 3 n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 看到這道題的第一反應是使用迴圈或者遞迴,但是,題目要求不能使用for while if else switch case等關鍵字及條件判斷語句。第二...
64 求1 2 3 n(發散思維能力 )
題目描述 求1 2 3 n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 解題思路 1 利用 的短路特性 2 利用sizeof特性,使用公式n n 1 2 3 利用建構函式求解 先定義乙個型別,然後建立n個該型別的例項,那麼這個型別...