迅雷--2018校招AI算法笔试题

编程题

1.

  • 输入: 每行数字短横符-分隔两个数组,冒号分隔:参数K
  • 输出: 输出为和最大的K个数,和是两个数组中各一个数相加而得
  • 样例输入: 2,4,2,7,7- 3,2,5,6,1,9:6
  • 样例输出: 16,16,13,13,13,12
  • hint: 注意性能

思路: 先对两个数组进行排序(降序),然后求出两个数组中各取出一个数字的所有和(之前有总结过,list定义时用循环嵌套,相当于排列组合),再排序,输出给定的前n个,输出时要注意转为字符串。

def find_max(a,b,num):
    a.sort(reverse=True)
    b.sort(reverse=True)
    res_list = []
    for i in a:
        for j in b:
            res_list.append(i+j)
    res_list.sort(reverse=True)
    res = res_list[:num]
    print ','.join(str(i) for i in res)

2. 给定一维数组,要求找出数组中一个数,使得该数等于左边之和同时也等于右边之和,如果有多个仅输出第一个,如果没有则返回false

  • 输入:每行数字为一个数组,数组元素用逗号分隔
  • 输出:要求输出为一个数字或者false
  • 样例输入:3,1,4,4
  • 样例输出:4
  • hint: 注意性能和类类型转换

思路: 遍历数组,添加此元素,左边的和,右边的和到集合中,如果集合的len为1,说明这三个元素相等,则添加到结果列表中。

def find_sp_num(a):
    res_list = []
    if len(a) < 3:
        print 'False'
    elif len(a) == 3:
        if len(set(a)) == 1:
            print a[0]
        else:
            print 'False'
    else:
        for i in range(1,len(a)):
            res = set()
            left_sum = 0
            right_sum = 0
            left = a[:i]
            right = a[i+1:]
            for n in left:
                left_sum += n
            for m in right:
                right_sum += m
            res.add(left_sum)
            res.add(a[i])
            res.add(right_sum)
            if len(res) == 1:
                res_list.append(a[i])
        if len(res_list) != 0:
            print res_list[0]
        else:
            print 'False'

有更好的办法欢迎指导!

你可能感兴趣的:(迅雷--2018校招AI算法笔试题)