快手笔试(未完待更)

题目描述
找到一个数组中所有满足以下条件的元素的下标:这个元素前有且仅有一个大于其的元素。如果不存在这样的元素就输出-1。要求算法的时间复杂度为 O(n)
样例一
1 22 22 33 22 12 45 44 5
4 7
样例二
1 22 54 123
-1

解法:

l = list(map(int, input().split()))
res, firstmax, secondmax = [], 0, 0
for i in range(len(l)):
    if l[i] > firstmax:
        secondmax = firstmax
        firstmax = l[i]
    else:
        if l[i] == firstmax:
            secondmax = l[i]
        else:
            if secondmax <= l[i]:
                secondmax =l[i]
                res.append(i)
print(" ".join(map(str, res)) if res else -1)

题目描述
手机号后8位,如果有3个及3个以上的连续数字或相同数字,如123(这叫顺子),666(这叫豹子),则称为靓号。每个靓号有自己的价值,按照每个靓号的价值大小排序输出(由大到小),价值的评定规则如下:
1)位数越多价值越大
2) 同位数的豹子大于顺子
3)同时有豹子很顺子取价值最大的
4)价值相同的手机号输出顺序按输入顺序
如果不存在靓号,则输出 null
样例一
15112347234,15176313245,15176313346,15176313325,15166667234,15188847234
15166667234,15112347234,15188847234
样例二
14612244221,14612544221,14612644221
null

解法:
对每个输入的手机号做一趟遍历提取出满足条件的豹子、顺子子串,然后计算子串最大长度,如果子串长度相同,豹子赋予标记位1,顺子赋予标记位0

l = list(input().split(','))
res = []
for i in range(len(l)):
    tmp = []
    for j in l[i][3:]:
        tmp.append(int(j))
    baozi, shunzi, l_baozi, l_shunzi, j = "", "", [], [], 0
    while j < 7:
        if tmp[j] + 1 == tmp[j+1]:
            k = j + 1
            while k < 7:
                if tmp[k] + 1 == tmp[k +1]: k += 1
                else: break
            shunzi = "".join(map(str, tmp[j:k + 1]))
            if len(shunzi) >= 3: l_shunzi.append(shunzi)
            shunzi = ""
            j = k
        elif tmp[j] == tmp[j + 1]:
            

            k = j + 1
            while k < 7:
                if tmp[k] == tmp[k+1]: k+=1
                else: break
            baozi = "".join(map(str, tmp[j:k + 1]))
            if len(baozi) >=3: l_baozi.append(baozi)
            j = k
        else:
            j += 1
    mmax_shunzi = max(len(i) for i in l_shunzi) if l_shunzi else 0
    mmax_baozi = max(len(i) for i in l_baozi) if l_baozi else 0
    if mmax_shunzi == 0 and mmax_baozi == 0:
        continue 
    if mmax_baozi >= mmax_shunzi:
        res.append((l[i], mmax_baozi, 1))
    else:
        res.append((l[i], mmax_shunzi, 0))
if res:
    res.sort(key = lambda x: (x[1], [2]))
    for i in range(len(res) - 1, -1, -1):
        print(res[i][0])
else:
    print("null")

题目描述
有一块板子,上面个单元标有对应的能量值,要在板子上放芯片(板子和芯片都为矩形,不一定是方的)。放芯片有如下规则:
1)芯片覆盖区域内的能量值要相同,若不相同则要释放能量,释放掉几个单位的能量,安装芯片的代价就为多少
2)如果有多个代价最小的安装的位置,则依照行最小,行一样依照列最小
3)如果在当前代价下没有可安装位置,则寻找次小代价的位置进行安装,直至板子无法再安装
输入:
m n a b (mxn板子大小, axb芯片大小)
mxn的矩阵表示各单元的能量值
输出
x y cost (安装芯片位置的左上角所占的单元格位置,以1为起始,安装芯片的代价)
样例一
输入
2 2 2 1
2 1
3 1
输出
2
1 2 0
1 1 1
样例二
输入
4 5 2 3
1 8 7 9 4
7 5 4 2 2
6 7 8 9 3
4 5 5 6 2
输出
2
3 2 10
1 3 16

发布了152 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/105048218