笔试题&面试题

1.问题:写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数. 设计出一个算法,只需要执行1.5n次比较就能找到序列中最大和最小的数吗?能否再少?

解析:要求比较次数为1.5n,使用一般的逐个遍历每个元素然后判断其是否为最大最小值是需要2n次的比较的,所以这样的方法是行不通的。现在考虑采用,每次从数组中取出两个元素,判断其大小,然后再分别判断其是否是最大或最小值,这样一次处理两个元素,每一次比较3次,最终的比较次数就是n/2*3=1.5n。

2.问题:一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

解析:(拿sum去试探加每个元素)sum帮我将数组中元素一个一个加,每累加一次如果大于之前max,就将max更新为sum,否则max继续保持原来的值,sum继续找,直到完。

3.问题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

解析:
  • 题目是要求nums中有两个数和是target,那么就应该是nums中会存在一个target - nums[i]的数,这种变换思维是要具备,即当题目需要得到什么结果,将这个结果推到出等价的描述,得到一些充分条件或者必要条件,在想办法(算法)去得到这些条件,当然也要具备一些基础知识,比如hash思想,知道hash方法它有哪些应用场景和它还有可能解决什么问题。
  • 题目转换为nums中找到一个target - nums[i]的数,那么可以先得到这些target - nums[i],即得到两个nums.length大小的数组,再去找到两个数组中相同的数,找到相同的数,最容易的方法就是通过hash思想,有很多类似找相同数或者元素都有借助hash思想。
  • coding:
  • def handle(arr, target):
        dict1 = {}  # 保存数值及对应的索引
        res = []    # 返回结果
    
        for i in range(len(arr)):
            # 另外一个值
            num = target - arr[i]
            # 如果这个数不在字典里,保存起来;在字典里,返回
            if num not in dict1:
                dict1[arr[i]] = i
            else:
                res.append([dict1[num], i])
        return res
    
    if __name__ == '__main__':
        res = handle([1,2,3,4,5], 6)
        print(res)

     

posted @ 2020-07-17 21:07  今夜无风  阅读(162)  评论(0编辑  收藏  举报