剑指offer——发散思维能力

面试题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	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值