【无标题】计算机面试题整理

计算机面试题–求和问题

1、 两数求和

该题时间复杂度为O(n)

"""
1:nums为一组数组
2:目标值target
3:找出数组中和为目标值的两个整数,返回下标
"""


def two_sum(nums, target):
   dict_ret = {}
   for i, n in enumerate(nums):  # 遍历nums,组合为索引序列
       # i为下标,n为实际的数字
       if n in dict_ret:
           return [dict_ret[n], i]  # 返回[字典[等于当期数值的key],当前数值的下标]

       dict_ret[target - n] = i  # {期望得到的数值:目前数值下标}

   return []


nums = [2, 3, 5, 0, 1]
target = 6
obj = two_sum(nums, target)

2、两数求和–升序数组

该题解题方法的时间复杂度为O(n)

"""
1、nums为一组按升序排序的有序序列
2、target为目标值
3、找到两个下标使对应的值之和等于目标值
4、假定每种输入只有个答案,且每个数值只能用一次
"""

def sum_sort(nums, target):
    i, j = 0, len(nums)-1
    while i < j:
        ret = nums[i] + nums[j]
        if ret == target:
            return [i, j]
        elif ret > target:
            j -= 1
        elif ret < target:
            i += 1

    return []

nums = [0, 1, 2, 4, 5]
target = 3

obj = sum_sort(nums, target)
print(obj)

3、三数求和

时间复杂度为O(n^2)

"""
1、nums是一个包含N个整数的数组
2、nums中存在三个元素A、B、C,且A+B+C=0
3、找出所有满足条件二且不重复的三元组
"""


def three_sum(nums):
    nums.sort()
    ret = []
    i = 0
    while i < len(nums) - 2:
        target = -nums[i]  # target为另外两个数的和
		
		# 此处变成求两位数相加等于目标值target
        h = {}
        j = i + 1
        while j < len(nums):
            current = nums[j]  # 根据下标得到的第二位实际数值
            if current in h:  # 判断得到的数是否在h的key中
                ret.append([nums[i], h[current], nums[j]])
            else:
                h[target - current] = current  # h中存储的数{第三位数的实际值:第二位数的实际值}
            j = skip_dup(j, nums)

        i = skip_dup(i, nums)

    return ret

def skip_dup(i, nums):
"""下个数于当前数值相同则跳过"""
    n = i + 1
    while n < len(nums) and nums[n] == nums[i]:
        n = n + 1
    return n

nums = [-1, 0, 1, 2, -1, -4]
obj = three_sum(nums)
print(obj)

4、四数求和

"""
1、nums是一个包含N个整数的数组
2、nums中存在四个元素A、B、C、D,且A+B+C+D等于目标数值target
3、找出所有满足条件二且不重复的四元组
"""

def four_sum(nums, target):
    nums.sort()
    ret = []
    i = 0
    while i < len(nums) - 3:
        j = len(nums) - 1
        while j > i:
            # 求三数之和
            k, l = i + 1, j - 1
            remain = target - (nums[i] + nums[j])
            while k < l:
                s = nums[k] + nums[l]
                if s == remain:
                    ret.append([nums[i], nums[j], nums[k], nums[l]])
                    k, l = move(k, nums, 1), move(l, nums, -1)
                elif s > remain:
                    l = move(l, nums, -1)
                else:
                    k = move(k, nums, 1)
            j = move(j, nums, -1)
        i = move(i, nums, 1)

    return ret
    
def move(i, nums, nun):
    n = i + nun
    while n < len(nums) and nums[n] == nums[i]:
        n = n + nun
    return n

nums = [1, 0, -1, 0, -2, 2]
target = 0
obj = four_sum(nums, target)
print(obj)

转载:文献参考《高效制胜-程序员面试典型题解》吴江编著

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值