2021华为校园招聘-软件-笔试

时间:2020年8月12日 19:00:00 -- 21:10:00
公司:华为
题型:3道编程题

第一题:
思路:初始化零钱,按照顾客支付顺序模拟,遇到零钱数额为负值返回false,顺利走完返回true
"""
每杯咖啡5元,客户支付5,10,20元三种,初始无备用零钱
输入:一串数字序列,表示顾客每次支付的金额
输出:如果能成功找零钱,返回true,顺序号;
     如果不能成功,返回false,顺序号;
"""


def fun(pays):
    money = {
        5: 0,
        10: 0,
    }
    for i, pay in enumerate(pays):
        if pay == 5:
            money[5] += 1

        elif pay == 10:
            money[5] -= 1
            money[10] += 1

        else:
            money[5] -= 1
            money[10] -= 1

        if min(money.values()) < 0:
            return 'false', i + 1

    return 'true', len(pays)


p = list(map(int, input().split(',')))
f, l = fun(p)
print('{},{}'.format(f, l))


第二题 80%,求指点
自己思路:从(0,0)点dfs,把所有可访问点加入visit集合中,最终如果右下角在集合内,说明可达,则返回1,否则返回0
"""
小明喜欢走地砖格,并且按照固定步长,某天小明通过一个部分铺设瓷砖的路,判断小明是否从左上角走到右下角
输入:
第一行步长s(s>0)
第二行为矩阵行M和列N(0 < M,N <= 100)
第三行开始为矩阵数值,0表示没地砖,不能走,1表示有砖,可以走
小明从左上角走到右下角(这两个位置保证为1)
输出:
可以通过返回1,否则返回0
"""

s = int(input())
M, N = map(int, input().split())
matrix = []
for i in range(M):
    matrix.append(list(map(int, input().split())))

# 可以通过返回1,不能通过返回0
direction = ((s, 0), (0, s), (-1 * s, 0), (0, -1 * s))
visited = set()


def go(i, j):

    if i < 0 or i >= M or j < 0 or j >= N or (i, j) in visited or matrix[i][j] == 0:
        return False

    visited.add((i, j))
    for d in direction:
        go(i + d[0], j + d[1])


go(0, 0)
if (M - 1, N - 1) in visited:
    print(1)
else:
    print(0)

第三题 91% 内存超了,求指点
自己思路:使用10的X模板,首先顺序输入字符串,同时遍历模板矩阵,只存放在1的位置,存放完毕后,再按列输出即可
"""
输入一个仅由大写字母组成的字符串string和一个指定的奇列数N
其中(1 < len(string) <= 2000), (3 <= N < 1000)
输出变形后的新字符串

例如:
输入:
EVERYTHINGGOESWELL,5
['E', 0, 0, 0, 'V']
[0, 'E', 0, 'R', 0]
[0, 0, 'Y', 0, 0]
[0, 'T', 0, 'H', 0]
['I', 0, 0, 0, 'N']
[0, 'G', 0, 'G', 0]
[0, 0, 'O', 0, 0]
[0, 'E', 0, 'S', 0]
['W', 0, 0, 0, 'E']
[0, 'L', 0, 'L', 0]
输出:
EIWETGELYORHGSLVNE
"""


string, N = input().split(',')
N = int(N)

base = [[0] * N for _ in range(N)]
for i in range(N):
    base[i][i] = 1
    base[i][N - i - 1] = 1
base = base[:-1]

template = []
x = len(string) // (2 * N - 3) + 1
for i in range(x):
    for j in base:
        template.append(j[:])


def next(i, j):
    if j == N - 1:
        return i + 1, 0
    else:
        return i, j + 1


i, j = 0, 0
for c in string:

    while template[i][j] != 1:
        i, j = next(i, j)
    template[i][j] = c


res = ''
for j in range(N):
    for i in range(len(template)):
        if template[i][j] not in [0, 1]:
            res += template[i][j]

print(res)


#笔经##华为#
全部评论
第三题找到规律写个循环就可以了。。 我第二题是死活60% 然后交了。。
点赞 回复 分享
发布于 2020-08-12 20:42
第三题桶排序的思路然后序号找规律过了……第二题也80hhh
点赞 回复 分享
发布于 2020-08-12 20:55
第二题用python会栈溢出,同样的算法改写成c++就行了🤣
点赞 回复 分享
发布于 2020-08-12 20:59
第三题我想法是,顺序遍历,双指针头尾依次写到数组里,满了就再加一行数组重新写,最后按列输出
点赞 回复 分享
发布于 2020-08-12 21:30
请问测试岗也是做同样的机试题吗?
点赞 回复 分享
发布于 2020-08-12 22:39
第三题我的思路先计算每个字母对应的列数,循环从0遍历到行数row减二,n为字母个数除以每个x的字母树减去二,对于row-n-1>n的数值先存n再存row-n-1, 小于的话反过来,等于的话直接存n,然后依次根据编号存到相应的列的字符串中,返回这些字符串的和 100%
点赞 回复 分享
发布于 2020-08-13 09:19
第一题, 输入 5,5,5,20 应该返回‘true’  4 吧,这种情况是不是没有考虑到呀。而且找钱的策略也很重要吧,就是有10块的时候应该优先找10块钱给,没有的时候用5块钱凑。
点赞 回复 分享
发布于 2021-02-03 05:11

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
评论
6
32
分享
牛客网
牛客企业服务