一道华为机试题

前几天在找工作,结果华为研究所打电话过来,然后参加了华为的机试,面试的是算法,题目大概是有一串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))]

这个算法其实是先将原数据图1
做个标记,标记为
图2

然后将数据对进行排序(降序,第一列为原数据,第二列为标记)
图3

然后再对其进行一次顺序标记
图4

然后按照第二列(第一次的标记)进行排序
图5

那么第三列就是我们要的结果了。
这个算法其实并不完善,因为当原数据中有多个相同优先权的数值时,他们是按照出现的顺序执行的,而我的这个算法却正好会反过来。这个的解决办法其实也有很多,我就不一一列举了。
我在这里想再写一下我后来反思时的另一种算法。
代码如下:

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

这个算法其实要比原先的算法好理解,而且也没有之前的相同值顺序反了的尴尬问题的出现。推荐第二种算法。
由于我当时提交的算法有误,所以当然是挂掉了。写这篇文章是为了引以为戒,当时我的时间安排的不太合理,导致自己匆匆忙忙地提交代码,哎。愿大家都能有一个美好前程!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值