8.19华为笔试AC,附代码

代码写的比较乱,勉强AC了

Q1

题目大意:输出M N,表示M*N行的一个队伍,然后从外层到内层进行顺时针报数(下边矩阵所示),需要输出报的数 个位数是7,十位数是奇数的人所在的位置[[x1,y1], [x2,y2]...]。

1 2 3 4
10 11 12 5
9 8 7 6

直接模拟就好,坑点:m n的范围超出给的范围直接给0

def helper(n):
    a = n % 10
    b = (n // 10) % 10
    return a == 7 and b % 2


tmp = input().split()

try:
    M = int(tmp[0])
    N = int(tmp[1])
    assert 10<=M<=1000 and 10 <=N <=1000
    up, right, down, left = 0,N-1,M-1,0
    idx = 0
    res = []
    while up <= down and left <= right:
        for i in range(left, right+1, 1):
            idx += 1
            x = up
            y = i
            if helper(idx):
                res.append([x, y])

        up += 1

        for i in range(up, down+1, 1):
            idx += 1
            x = i
            y = right
            if helper(idx):
                res.append([x, y])

        right -= 1

        if left == right or up == down:
            break

        for i in range(right, left-1, -1):
            idx += 1
            x = down
            y = i
            if helper(idx):
                res.append([x, y])

        down -= 1

        for i in range(down, up-1,-1):
            idx += 1
            x = i
            y = left
            if helper(idx):
                res.append([x, y])

        left += 1

    res = str(res).replace(" ", "")
    print(res)
except:
    print("[]")

Q2

题目大意:二叉树有n个节点,每个节点的深度已知(代码中depth),让你计算该树总共有多少种可能的形状。
例如 depth为[0, 1]可能两种情况: 父节点和左孩子 、 父节点和右孩子
坑点: 下一层的个数可能会大于上一层个数的两倍,return 0

import os

n = int(input())
depth = [int(d) for d in input().split()]

M = 10 ** 9 + 7


def combination(n, k):
    if k == 0 or k == n:
        return 1
    k = min(k, n - k)

    top = 1
    for i in range(n, n - k, -1):
        top *= i

    down = 1
    for i in range(1, k + 1):
        down *= i

    return (top // down) % M


def helper():
    if n == 0:
        return 0

    max_depth = max(depth)
    depth_count = [0] * (max_depth + 1)

    for d in depth:
        depth_count[d] += 1

    for i in range(max_depth):
        if 2 * depth_count[i] < depth_count[i + 1]:
            return 0

    r = 1
    for i in range(1, max_depth + 1):
        r *= combination(2 * depth_count[i - 1], depth_count[i])
        r %= M

    return r


print(helper())

Q3

简化版俄罗斯方块
输出两个字符串s1,s2
s1相当于下边的情况,例如1221表示目前下边是(忽略\,怎么打空格来着):

\ ++
++++

s2相当于新来的小块, 例如121表示
+++
++

让你把新来的小块左右平移到合适的地方落下,问你最总最少剩下多少行?
俄罗斯方块一行满了就会消掉,就像s1=1221,其实最下边一行可以消掉了
我给的用例,最终剩下一行。

暴力模拟即可,给的测试用例相当友好
(经13楼指出,代码不对,官方的测试用例比较弱,能够AC)

#include<iostream>
#include<vector>
#include<queue>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
#include<string>
#include<stack>
#include<cmath>
#include<set>
#include<ctime>
#include<map>
#include<istream>
#define LL long long
using namespace std;



int helper(vector<int>& frame, vector<int>& brick)
{
    int frame_n = frame.size(), brick_n = brick.size();

    int res = 1000000;

    for (int i = 0;i < frame_n - brick_n + 1;i++)
    {
        int max_h = 0, total_max_h;
        for (int j = 0;j < brick_n;j++)
            max_h = max(max_h, brick[j] + frame[i + j]);
        total_max_h = max_h;
        int r = 100000;
        for (int j = 0;j < frame_n;j++)
        {
            total_max_h = max(total_max_h, frame[j]);
            if (j < i)
                r = min(r, frame[j]);
            else if (j >= (i + brick_n))
                r = min(r, frame[j]);
            else
            {
                int tmp1 = frame[j], tmp2 = brick[j - i];
                if (tmp1 + tmp2 == max_h)
                    r = min(r, max_h);
                else
                    r = min(r, tmp1);
            }
        }
        res = min(res, total_max_h - r);
    }
    return res;
}

int main()
{
    string s1, s2;
    cin >> s1 >> s2;
    vector<int> frame(s1.size()), brick(s2.size());
    for (int i = 0;i < s1.size();i++) frame[i] = s1[i] - '0';
    for (int i = 0;i < s2.size();i++) brick[i] = s2[i] - '0';

    cout << helper(frame, brick);

    return 0;
}
#笔试题目##华为#
全部评论
第三题,4023,211  和 4022,221结果感觉不太对呀。
2 回复 分享
发布于 2020-08-19 22:56
if left == right or up == down: break第一题这个代码为什么放在右下角?
1 回复 分享
发布于 2020-08-20 01:27
大佬,你这测试用例 1221  121 答案不是 3 吗,怎么会是1呢
点赞 回复 分享
发布于 2020-09-17 15:34
mark
点赞 回复 分享
发布于 2020-09-15 23:23
我问一下,第三题,1221和121加起来不是2431或者2341两种(不考虑悬空),最高4行,最低1行,消掉1行,难道不是剩下3行?上个月做的,马上面试了,求解答
点赞 回复 分享
发布于 2020-09-11 20:42
大佬们,你们收到面试邀请了吗,或者说你们有没有收到笔试通过的信息呢,我哭了
点赞 回复 分享
发布于 2020-08-31 21:06
最后一道题可不可以遍历把砖块加上,计算最大高度减去最小高度就行???
点赞 回复 分享
发布于 2020-08-31 20:44
想问下楼主第二题的思路,另外有没有类似题目的练习方法呀,感觉组合题老是没思路...,有什么练习的题型么,leetcode好像做过的比较少
点赞 回复 分享
发布于 2020-08-23 14:26
想问一下有人遇到这种情况吗?就是在本地编译器上能A,到网页上就不能?为啥呀?
点赞 回复 分享
发布于 2020-08-20 21:39
看起来有难度
点赞 回复 分享
发布于 2020-08-20 21:29
借楼问下有天津的小伙伴收到软件类笔试通知了吗
点赞 回复 分享
发布于 2020-08-20 20:58
赞!吸吸欧气,请问大佬是哪个地理区域的(华为的那个招聘分区)
点赞 回复 分享
发布于 2020-08-20 20:57
华为笔试能用本地IDE吗?😆
点赞 回复 分享
发布于 2020-08-20 19:44
昨天做题的,大家收到测评了吗
点赞 回复 分享
发布于 2020-08-20 17:28
我0.6 0.9 0.9能过吗,听说必须有一题完全ac?
点赞 回复 分享
发布于 2020-08-20 15:35
第二题无效输入直接return的么😪我先输出0后才return,这样只过了0.3
点赞 回复 分享
发布于 2020-08-20 10:51
最后一题应该是直接可以落下去不考虑的悬空的对吧,,, 和平时玩的俄罗斯方块不太一样
点赞 回复 分享
发布于 2020-08-20 10:34
楼主投的是哪个部门,是正式批吗
点赞 回复 分享
发布于 2020-08-20 10:02
第一题非法输入时的空数组 是返回null 还是n*2的二维数组?还有题目说n*2的二维数组,这里的n与输入的n有关系吗?是一个n吗?个人感觉是动态的二维数组(列为2)
点赞 回复 分享
发布于 2020-08-20 07:57
n=int(input()) list1=list(map(int, input().split())) max1=max(list1) list1.sort() dic={} for i in list1:     if i not in dic:         dic[i]=1     else:         dic[i]+=1 res=1 def c(a,b):       res=1     for i in range(b):          res*=(a-i)/(i+1) #如果b>a 则res为0     return res for i in range(1,max1+1):    d=c(dic[i-1]*2,dic[i])    res*=d print(int(res)%1000000007) 我这种怎么才20%呀😂
点赞 回复 分享
发布于 2020-08-19 22:18

相关推荐

Eeeeevans:都是校友,还是同届,我就说直白点,不委婉了,我相信你应该也不是个玻璃心,首先你觉得一个双非的绩点写简历上有用吗?班长职务有用吗?ccf有用吗?企业会关心你高数满分与否吗?第二,第一个项目实在太烂,一眼就能看出是外卖,还是毫无包装的外卖,使用JWT来鉴权,把热点数据放进Redis这两个点居然还能写进简历里,说难听点这两个东西都是学个几十分钟,调用个API就能完成的事情,在双非一本的条件下,这种项目你觉得能拿出手吗,第二个项目你写的东西和你的求职方向有任何的匹配吗?第三,计设那一块毫无价值,如果想突出自己会前端,直接写入专业技能不行吗,最后,专业技能里像深入理解JVM底层原理这种你觉得这句话你自己真的能匹配吗?都是校友加上同届,我措辞直接,但希望能点出你的问题,想进大厂还得继续沉淀项目和学习
点赞 评论 收藏
分享
no_work_no_life:深圳,充电宝,盲猜anker
点赞 评论 收藏
分享
评论
28
162
分享

创作者周榜

更多
牛客网
牛客企业服务