善用信息进行优化的算法面试题例举

1)百度公司有3万名员工,请按照年龄对员工进行排序。

本题可以用认为是一个排序算法的问题。但如果简单的这么认为,那么算法优化时就没能很好的利用已有的信息。

由于年龄有一定的范围,所以可以根据这个特点来优化。

我们假设年龄在0-100这个范围之内。这样可以用一个hash table(这里可以简化为一个数组)来表示这个信息。

数组的下标可以为年龄,数组的值则可以记录这个年龄的人数。这样就起到了一个key-value的hash table的作用。

具体代码如下:

def sortAges(ages):
    length = len(ages)
    assert(length > 0)
    
    innerAges = [ ]  #用来记录年龄的hash table
    for i in range(1, 100): # 初始化的值全0
        innerAges.append(0)

    for it in ages:    #统计当前的数组中各个年龄的人数
        assert(0< it <100)
        innerAges[it] += 1
        
    for i in range(len(innerAges)): # 注意这里i来表达的时实际的年龄,innerAges[i] 则表达了这个年龄的人数
        if innerAges[i] > 0:             
            for j in range(innerAges[i]): # 输出i 年龄段的人数
                print(i)

# Test Case
ages = [25, 26, 22, 20, 19, 34, 32, 80, 32, 35, 30, 25, 26, 22, 20, 19, 34, 32, 30, 30, 19, 19]
sortAges(ages)

 

2) 寻找“灌水王”,论坛里有个人发的贴子超过了半数,请找出这个人的ID。

我们可以把这个问题简化成一个数组中有个数,出现的次数超过了半数,然后找出它来。

这样问题就好解决了。可以统计出每个数出现的个数,然后找出个数超过半数的即可,但这么做效率太低。

我们利用已有的条件,这个数超过了半数,如果我们每次将这个数和其他数进行各自一半的去除,则最后留下来的数一定

是超过半数的数。具体来说:我们先给某个数赋个初值,如果下一个数等于这个数,将其个数+1,如果不是这个数,

则将其个数-1,当前个数为0时,则用下一个数来取代这个数。这个过程尝试于将这个数与其他数每次各自-1,

这样做如果这个数超过半数,所以最后剩下的总是这个数。

具体代码实现如下:

def findSpecialNum(array):
    """
    在一组数种寻找超过半数的数字
    """
    num = array[0]
    count = 1
    for i in range(1, len(array)):
        #print("checking ", num, array[i])
        if count == 0:
            num = array[i]
            count = 1
        if array[i] != num:
            count -= 1
        else:
            count += 1
        #print(count)
        
    count = 0
    for i in array:
        if num == i:
            count += 1
    if count*2 > len(array):  # 由于输入可能不合法,这里需要做一次检查
        return num
    else:
        print("Didn't get the num")
        return None

if __name__ == "__main__":
    a = [1,2,1,3,1,1,1,1,-2,6,1,1,1,9,-1,8,1,1,1,2,-1,1,-1,2,5,9,8,1,1,1,1,2,2,2,2,22,22,2,1,1,1,1,1,1,1,1,1,1,1,1,1]
    print(findSpecialNum(a))

这两个例子很好的说明了在算法优化过程中,对已知信息善加利用的重要性!

 

 

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值