前几天在找工作,结果华为研究所打电话过来,然后参加了华为的机试,面试的是算法,题目大概是有一串1-9组成的列表,数字代表优先级,数字越大优先级越高。从第一个数字开始判断,如果列表中没有优先级比它还高的数字,就执行它,如果后边有比它优先级还要高的数字,就把第一个数字放到列表尾端,依次往下判断,直至所有数据都被执行。然后题目要求输出这串列表中每个数字执行的顺序。
例如:
输入:
1,7,6,2,3,5,6,7,9
输出:
8,1,3,7,6,5,4,2,0
我当时提交的代码如下:(python3)
def test3(p):
a = [[p[i], i] for i in range(len(p))]
a.sort(reverse=True)
b = [a[i]+[i] for i in range(len(a))]
b = sorted(b, key=lambda x:x[2])
return [b[i][1] for i in range(len(b))]
当时由于一直在思考平台的问题,没有注意到我的代码简直惨不忍睹。我当时的想法的真正代码其实是
def test3(p):
a = [[p[i], i] for i in range(len(p))]
a.sort(reverse=True)
b = [a[i]+[i] for i in range(len(a))]
b = sorted(b, key=lambda x:x[1])
return [b[i][2] for i in range(len(b))]
这个算法其实是先将原数据
做个标记,标记为
然后将数据对进行排序(降序,第一列为原数据,第二列为标记)
然后再对其进行一次顺序标记
然后按照第二列(第一次的标记)进行排序
那么第三列就是我们要的结果了。
这个算法其实并不完善,因为当原数据中有多个相同优先权的数值时,他们是按照出现的顺序执行的,而我的这个算法却正好会反过来。这个的解决办法其实也有很多,我就不一一列举了。
我在这里想再写一下我后来反思时的另一种算法。
代码如下:
def test4(a):
res = [0 for i in range(len(a))]
b = sorted(a, reverse=True)
n = 0
for i in b:
if i in a:
j = a.index(i)
res[j] = n
n += 1
a[j] = -1
return res
这个算法其实要比原先的算法好理解,而且也没有之前的相同值顺序反了的尴尬问题的出现。推荐第二种算法。
由于我当时提交的算法有误,所以当然是挂掉了。写这篇文章是为了引以为戒,当时我的时间安排的不太合理,导致自己匆匆忙忙地提交代码,哎。愿大家都能有一个美好前程!