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))
这两个例子很好的说明了在算法优化过程中,对已知信息善加利用的重要性!