面试题64:求1+2+…+n
- 题目描述:
求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
return sum(list(range(1, n + 1)))
2、解法二:利用两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,如果对n连续进行两次反运算,那么非零的n转换为True,0转换为False。利用这一特性终止递归。
# -*- 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):
func = {False: self.sum0, True: self.sum}
return n + func[not not n](n - 1)
3、解法三:终止递归采用逻辑与的短路特性
# -*- coding:utf-8 -*-
class Solution:
def Sum_Solution(self, n):
# write code here
return n and n + self.Sum_Solution(n - 1)
面试题65:不用加减乘除做加法
- 题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“×”、“÷”四则运算符号
- 详细代码:
1、解法一:Python函数
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
return sum([num1, num2])
2、解法二:三步走策略:①只做各位相加不进位(可以用异或来处理,和异或结果相同);②进位:可以想象为两个数先做位与运算,然后左移一位;③把前两个步骤的结果相加,重复前两步,直到不产生进位为止。在Python中做位运算,需要做越界检查。
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
while num2:
sum = (num1 ^ num2) & 0xffffffff
carry = ((num1 & num2) << 1) & 0xffffffff
num1 = sum
num2 = carry
if num1 < 0x7fffffff:
return num1
else:
return ~(num1 ^ 0xffffffff)
面试题66:构建乘积数组
- 题目描述:
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。
- 详细代码:
# -*- coding:utf-8 -*-
class Solution:
def multiply(self, A):
# write code here
if not A or len(A) <= 0:
return []
length = len(A)
B = [1] * length
for i in range(1, length):
B[i] = B[i - 1] * A[i - 1]
temp = 1
for i in range(length - 2, -1, -1):
temp *= A[i + 1]
B[i] *= temp
return B