4.10 华为机试第二题的奇葩坑

如果大家和我一样感觉没问题,最后还是不通过可以看看。
较为明显的坑:

  1. 数字可能是多位,如12
  2. 括号有三种{[(
  3. 括号内可嵌套,3(a2[b])

然而我跳的坑就比较奇葩了。代码如下:(我找了1个半小时的错,最后考试出来十分钟就找到了,难受)
我赌一包辣条(我猜大部分人一眼看不出来代码的错)

# 看a和b是否是一组括号
def is_pair(a, b):
    if a == '{':
        if b == '}':
            return True
        else:
            return False
    if a == '(':
        if b == ')':
            return True
        else:
            return
    if a == '[':
        if b == ']':
            return True
        else:
            return False
    return False
# 是否是数字
def is_num(a):
    if ord(a) <= ord('9') and ord(a) >= ord('0'):
        return True
    else:
        return False
# 是否是kuo
def is_kuohao(a):
    if a == '{':
        return True
    if a == '}':
        return True
    if a == '(':
        return True
    if a == ')':
        return True
    if a == '[':
        return True
    if a == ']':
        return True
    return False

def repeat_str(s, begin, end):
    if begin==end:
        return s[begin]
    result = ''
    idx = begin
    kuohao = []
    shuzi = 1
    tmp_b = -1
    tmp_e = -1
    tmp_shu = -1
    while idx <= end:
        if is_num(s[idx]):
            tmp_shu = idx
            idx += 1
            # 数字可能多位
            while is_num(s[idx]):
                idx += 1
            # 这时候只要找到这个括号的起始位置即刻
            shuzi = int(s[tmp_shu:idx])  # 保存倍数
            kuohao.append(s[idx])  # 保存左括号
            tmp_b = idx + 1  # 保存递归所需
            # 找到该数字后的那对括号位置
            while kuohao:
                idx += 1
                if is_kuohao(s[idx]):
                    # 是括号,如果匹配了括号栈里最后一个则退栈
                    if is_pair(kuohao[-1], s[idx]):
                        kuohao.pop()
                    else:
                        kuohao.append(s[idx])
            tmp_e = idx - 1
            idx += 1
            # 拼接递归的结果
            result = result + (repeat_str(s, tmp_b, tmp_e) * shuzi)
        else:
            result = result + s[idx]
        idx += 1
    return result

while True:
    try:
        in_str = input()
        result = repeat_str(in_str, 0, len(in_str) - 1)
        print(result[::-1])
    except:
        break

错误在:倒数部分,

idx+=1
# 拼接递归的结果

这个注释上面一行的,idx+=1.
忘记了while循环会有idx+=1,这里画蛇添足了。所以前面的基本没有错,但是如果循环部分在前面就会有错,当时试的太少了。。。而且迷惑性也太强了吧!前面试了半天感觉没错,居然死在这,最后通过还是0%。。。
如图1

总结:例子一定要多试,如果通不过肯定是有坑!

#华为##笔试题目##春招#
全部评论
讲道理,这题属于交代不清楚
点赞 回复
分享
发布于 2019-04-10 22:15
交完卷两分钟找到问题➕1
点赞 回复
分享
发布于 2019-04-10 21:46
联易融
校招火热招聘中
官网直投
交完卷两分钟找到问题+1
点赞 回复
分享
发布于 2019-04-10 21:47
楼主第一题有代码吗 我本地一直过了 就是通不过 心态炸了
点赞 回复
分享
发布于 2019-04-10 21:51
请问 只做出来第一题能过机试吗??
点赞 回复
分享
发布于 2019-04-10 21:53
woc,还真没考虑到括号有三种,全按圆括号考虑的,第1和第3个坑倒是解决了,最后还是0.00%的通过率,吐血!
点赞 回复
分享
发布于 2019-04-11 10:50

相关推荐

拿到卷子后先看了一下大概题目,第一题感觉很简单啊,用stack感觉很快就能写出来。20min后第一次提交10%,以为是自己输出没删空格,结果改了还是不对,就这样又拖了一会。(其实是因为用char去读取了扑克牌的数字,扑克牌中会有10的,做完后才知道。。。)此时还剩大概一个半小时,有点紧张说实话,第一题这么久没a出来大概只能23题二选一了。第二题看了一会儿,感觉要构建一颗树,觉得有点麻烦,直接cout&nbsp;3&nbsp;骗了5%跑路了。。。第三题题干有点长,但是一看输入是矩阵基本就是dfs&nbsp;bfs这一类的,直接套卡子哥的bfs模板,一步一步来。大概50min左右写完(因为我喜欢写完一个就cout看看自己错没错,所以很慢),测试例子过了就提交,直接ac了。顿时如释重负,但是此时也只剩30min了,第二题读题读完估计也没时间写了,第一题也不知道错哪了,就提前15min交卷去和舍友吐槽了。。。。总体评价:华子机考与其说是编程题,更像是阅读理解,c++选手必须十分注意输入和输出,真的比较恶心。目前前两场实习机考感觉都是bfs&nbsp;dfs&nbsp;模拟这种为主,动态规划稍微难一点的算法感觉没涉及。另外千万不要死磕,华子感觉还是有模板题的,不可能三道都是很复杂的模拟或者没见过的算法,bfs&nbsp;dfs这种基本肯定会考的,所以非科班同学把这个练熟了其实还是很有希望过的。
投递华为等公司10个岗位
点赞 评论 收藏
转发
点赞 8 评论
分享
牛客网
牛客企业服务