惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

HaoKunT的博客

如何用 ollama 快速下载 deepseek 模型 - HaoKunT的博客 python使用gdal - HaoKunT的博客 Word中写LaTeX公式 - HaoKunT的博客 g++中的rpath和runpath - HaoKunT的博客 Ext4文件系统 - HaoKunT的博客 文件系统介绍 - HaoKunT的博客 理解shell - HaoKunT的博客 Hyper V安装ENVI - HaoKunT的博客 用C++实现一个命令行进度条 - HaoKunT的博客 PCA与GWPCA - HaoKunT的博客 字节后台实习生笔试题目 - HaoKunT的博客 Web终端仿真器 - HaoKunT的博客 阿里云API网关与函数计算的基础理解 - HaoKunT的博客 函数计算搭建DNS服务器 - HaoKunT的博客 DNS解析过程 - HaoKunT的博客 Github图片加载不出来 - HaoKunT的博客 将Elementary OS装在U盘中 - HaoKunT的博客 MacOS+Windows 双系统的安装 - HaoKunT的博客 IPXE+netboot+ISCSI 网络启动 - HaoKunT的博客 Esxi+NAS+Openwrt - HaoKunT的博客 Esxi的安装和使用 - HaoKunT的博客 利用acme自动更新证书 - HaoKunT的博客 Golang使用海康威视SDK - HaoKunT的博客 Filetools工具 - HaoKunT的博客 学习正则表达式 - HaoKunT的博客 Vugu View - HaoKunT的博客 Django Restframework 嵌套序列化 - HaoKunT的博客 看不了netlify的部署日志 - HaoKunT的博客 Go Modules的使用 - HaoKunT的博客 使用hugo+netlify部署个人主页 - HaoKunT的博客 关于我 - HaoKunT的博客 在线工具大全 - HaoKunT的博客 SWIG编译海康威视SDK 使用golang - HaoKunT的博客 SWIG 以Python为例 - HaoKunT的博客 Seafile - HaoKunT的博客 Golang的小技巧 - HaoKunT的博客 归档 - HaoKunT的博客 搜索 - HaoKunT的博客
华为软件实习生笔试 - HaoKunT的博客
HaoKunT · 2020-04-15 · via HaoKunT的博客

本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

缘起

做了个华为实习生的笔试,3道题,2小时,比字节和阿里要好点

题目

明日之星

题目名字叫明日之星,就是一个投票,输入一行人名(投给的人),然后统计谁的票数最高,输出票数最高的人的名字,然后如果有重票的,就按字母表来

由于忘了python多关键的排序咋弄的了,就写了个有点问题的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys

if __name__ == "__main__":
    
    line = sys.stdin.readline()
    data = line.strip().split(",")

    data_struct = dict()

    failed = False

    for vote in data:
        if not vote.isalpha():
            failed = True
            break
        if vote[0] not in "QWERTYUIOPASDFGHJKLZXCVBNM":
            failed = True
            break
        try:
            data_struct[vote] += 1
        except:
            data_struct[vote] = 1

    if failed:
        print("error.0001")
    else:

        res = sorted(data_struct.items(), key=lambda x: x[1], reverse=True)

        if len(res) > 1 and res[0][1] == res[1][1]:
            print(res[0][0] if res[0][0] < res[1][0] else res[1][0])
        else:
            print(res[0][0])

应该排序那里直接多关键字排序的,就是像这样

1
res = sorted(data_struct.items(), key=lambda x: (x[1], -x[0]), reverse=True)

寄存器匹配

输入一个待匹配的寄存器,和一串寄存器的字符串,输出匹配到的寄存器的addr,mask,val

输入大概长这样

read read[addr=0x17,mask=0xff,val=0x7],read_his[addr=0xff,mask=0xff,val=0x1],read[addr=0xf0,mask=0xff,val=0x80]

输出

0x17 0xff 0x7
0xf0 0xff 0x80

还有一些其他的不重要的输出约束

我写的代码长这样

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
read read[addr=0x17,mask=0xff,val=0x7],read_his[addr=0xff,mask=0xff,val=0x1],read[addr=0xf0,mask=0xff,val=0x80]
"""

import sys
import re

if __name__ == "__main__":
    line = sys.stdin.readline().strip()

    need_match, data = line.split(" ")

    # data = data.split(",")

    data = re.findall(r"\w*?\[.*?\]", data)

    data_struct = dict()

    for item in data:
        parse = re.findall(r"(\w*?)\[addr=(\w*?),mask=(\w*?),val=(\w*?)\]", item)[0]

        try:
            data_struct[parse[0]].append(parse[1:])
        except:
            data_struct[parse[0]] = [parse[1:]]

    
    keyword = ""
    addr = ""
    mask = ""
    val = ""
    if len(need_match.split("[")) == 1:
        keyword = need_match.split("[")[0]
    else:
        keyword, right = need_match.split("[")
        right = right[:-1]

        right_struct = right.split(",")

        for item in right_struct:
            key, value = item.split("=")

            if key == "addr":
                addr = value
            if key == "mask":
                mask = value
            if key == "val":
                val = value
    
    failed = False
    try:
        keyword_match = data_struct[keyword]
    except:
        failed = True

    if not failed:
        failed = True
        for item in data_struct[keyword]:
            match = True
            if addr:
                if addr.upper() != item[0].upper():
                    match = False
            if mask:
                if mask.upper() != item[1].upper():
                    match = False
            if val:
                if val.upper() != item[2].upper():
                    match = False
            if match:
                print(" ".join(item))
                failed = False
    
    if failed:
        print("FAIL")

写的挺长的,其实后来我发现我搞复杂了,好像题目的输入只会是关键字,待匹配的寄存器不会长这样read[addr=0x77],但是我考虑了这些。

计算调用栈的最大大小

哇,题目描述又很复杂,大概的意思就是给你一些函数之间调用关系的数据,然后让你统计一些哪个函数调用栈的内存调用最大

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
"""
5 2 3 1 0 0
1 20 2 3
2 30 3 4 5
3 50 4
4 60
5 80
"""

import sys

res = []

if __name__ == "__main__":
    line = sys.stdin.readline().strip()

    funcs_num = int(line.split(" ")[0])

    funcs_callnum = list(map(int, line.split(" ")[1:]))

    funcs_info = dict()

    # 生成一个调用矩阵
    call_matrix = [[0]*funcs_num]*funcs_num

    for i in range(funcs_num):
        line = sys.stdin.readline().strip()
        data = list(map(int, line.split(" ")))
        func_name = data[0]
        func_cost = data[1]
        call_link = data[2:]

        funcs_info[func_name] = [func_cost, call_link]

        for called in call_link:
            call_matrix[called-1][func_name-1] = 1

     
    # 然后分析调用链

    # 首先找入口

    infuncs = []

    for i in range(funcs_num):
       if 1 not in call_matrix[i]:
           infuncs.append(i+1)

    # 分析递归
    r = False
    for i in range(funcs_num):
        if call_matrix[i][i] == 1:
            r = True
    
    if r:
        print("R")
    else:
        for infunc in infuncs:
            find_(funcs_info, infunc)
        
        print(max(res))
    
def find_(call_info, call, cost=0):
    global res
    call_funcs = call_info[call][1]
    cost += call_info[call][0]

    if not call_funcs:
        res.append(cost)
        return
    
    for func in call_funcs:
        find_(call_info, func, cost)

我这个代码有问题,我也不知道哪错了,然后时间有点不够了就稀里糊涂交卷了,20%case.

回过头来看了下,主要的问题是调用矩阵那里,不知道怎么描述,大家自行debug一下就明白了,下面是我修改后的,也有点问题,是那个递归调用的判断那里太简单,但是我不想再去想了,回过头来想想其实不要那个什么狗屁调用矩阵,直接上递归完事,每个函数假设是入口,反正不是真入口的调用链肯定比真入口的短,答案还是不会错的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
5 2 3 1 0 0
1 20 2 3
2 30 3 4 5
3 50 4
4 60
5 80
"""

import sys

def find_(call_info, call, cost=0):
    global res
    call_funcs = call_info[call][1]
    cost += call_info[call][0]

    if not call_funcs:
        res.append(cost)
        return
    
    for func in call_funcs:
        find_(call_info, func, cost)

res = []

if __name__ == "__main__":
    line = sys.stdin.readline().strip()

    funcs_num = int(line.split(" ")[0])

    funcs_callnum = list(map(int, line.split(" ")[1:]))

    funcs_info = dict()

    # 生成一个调用矩阵
    call_matrix = [[0 for i in range(funcs_num)] for j in range(funcs_num)]

    for i in range(funcs_num):
        line = sys.stdin.readline().strip()
        data = list(map(int, line.split(" ")))
        func_name = data[0]
        func_cost = data[1]
        call_link = data[2:]

        funcs_info[func_name] = [func_cost, call_link]

        for called in call_link:
            call_matrix[called-1][func_name-1] = 1


     
    # 然后分析调用链

    # 首先找入口

    infuncs = []

    for i in range(funcs_num):
       if 1 not in call_matrix[i]:
           infuncs.append(i+1)

    # 分析递归
    r = False
    for i in range(funcs_num):
        if call_matrix[i][i] == 1:
            r = True
    
    if r:
        print("R")
    else:
        for infunc in infuncs:
            find_(funcs_info, infunc)
        
        print(max(res))

总结

还是不要想太多,用自己最有把握的来搞,另外,基础的一些内容还是要记住,不要总是去面向搜索引擎的编程。