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
大佬能说下第三题思路吗
点赞 回复 分享
发布于 2020-08-19 21:02
1 3AC,第二题感觉是排列组合再相乘,大佬什么想法
点赞 回复 分享
发布于 2020-08-19 21:02
assert m>=10 and m<=1000 and n>=10 and n<=1000  第一题少了这行代码,只过了AC-0.4,太坑了
点赞 回复 分享
发布于 2020-08-19 21:11
大佬说一下第三题
点赞 回复 分享
发布于 2020-08-19 21:13
!第二题没考虑2a大于b,才30
点赞 回复 分享
发布于 2020-08-19 21:15
第三题输入 2022 121 时候第二行不能消掉吗,这个题目有说吗
点赞 回复 分享
发布于 2020-08-19 21:16
大佬有题目吗
点赞 回复 分享
发布于 2020-08-19 21:17
第一题这么坑的吗?还是我审错题了 题干有描述,n与m超出范围直接输出[ ]吗???我不记得了哎 我还一直以为n和m的范围是题里面给定的
点赞 回复 分享
发布于 2020-08-19 21:19
大佬说下题目呢
点赞 回复 分享
发布于 2020-08-19 21:21
大佬真心牛逼!
点赞 回复 分享
发布于 2020-08-19 21:24
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
第一题非法输入时的空数组 是返回null 还是n*2的二维数组?还有题目说n*2的二维数组,这里的n与输入的n有关系吗?是一个n吗?个人感觉是动态的二维数组(列为2)
点赞 回复 分享
发布于 2020-08-20 07:57
楼主投的是哪个部门,是正式批吗
点赞 回复 分享
发布于 2020-08-20 10:02
最后一题应该是直接可以落下去不考虑的悬空的对吧,,, 和平时玩的俄罗斯方块不太一样
点赞 回复 分享
发布于 2020-08-20 10:34
第二题无效输入直接return的么😪我先输出0后才return,这样只过了0.3
点赞 回复 分享
发布于 2020-08-20 10:51
我0.6 0.9 0.9能过吗,听说必须有一题完全ac?
点赞 回复 分享
发布于 2020-08-20 15:35
昨天做题的,大家收到测评了吗
点赞 回复 分享
发布于 2020-08-20 17:28
华为笔试能用本地IDE吗?😆
点赞 回复 分享
发布于 2020-08-20 19:44

相关推荐

迪爷到现在都已经收了35w份简历了🤣吓人
在吃瓜的你很紧张:以前你叫迪子,现在你叫迪爷
点赞 评论 收藏
分享
28 162 评论
分享
牛客网
牛客企业服务