2019华为笔试题代码

之前因为赶火车,在KFC匆匆忙忙的做了点,只AC了第一题,第二题写了个开头就交卷了,第三题看了一眼,确认过眼神,是很难的题。所以后来回来后只抽空做了第二题,在这里贴一下第一题和第二题的代码做个记录。

之前没刷过算法题,也没看过算法方面的东西。。以为笔试会是安全方面的题,没想到竟然是统一的题。比较难受。代码比较渣,只求能用。

第一题

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
import sys
# 连续输入字符串(输入字符串个数为N,每个字符串长度不大于100,输入字符串间按照空格键分隔),请按长度为8拆分每个字符串后输出到新的字符串数组,输出的字符串按照升序排列。
# 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
# 输入描述:
# 输入内容:2 abc 123456789
# 输入说明:
# 1.
# 输入两个字符串(以空格分隔),其中一个为abc,另一个为123456789
# 输出描述:
# 输出结果: 12345678 90000000 abc00000
#
# 输出说明:
# 1.abc字符串需要再后边补零,12345789拆分为12345678与90000000,所有的字符串需要升序排列后输出(以空格分隔);
# 2.输出字符串中的重复字符串不能删除。
string_list = []


line = sys.stdin.readline().strip()
string_num = line.split(" ")[0] # 这个必须能读到的。根据这个判断下面有几个参数


for i in range(0, int(string_num)):
split_string = (line.split(" ")[i + 1]) # ojbk
string_list.append(split_string)


def loop_helper(string_list):
"""
这是一个循环处理函数,虽然时间复杂度有点高,但是我觉得应该可以循环到符合要求
:return: string_list
"""
divided_num_list = []
will_deleted_list = []
no_change_length = len(string_list)
for k in range(0, no_change_length):
if len(string_list[k]) == 8:
pass
elif len(string_list[k]) < 8:
need_zero_num = 8 - len(string_list[k])
string_list[k] = string_list[k] + "0" * need_zero_num
elif 8 < len(string_list[k]) <= 100:
will_deleted_num = string_list[k]
will_deleted_list.append(will_deleted_num)
will_divided_group_num = int(len(string_list[k]) / 8)
for m in range(0, will_divided_group_num):
divided_num = string_list[k][m * 8:(m + 1) * 8]
divided_num_list.append(divided_num)
last_num = string_list[k][will_divided_group_num * 8:]
divided_num_list.append(last_num)
else:
exit("string length > 100 !")
if divided_num_list:
for tmp1 in divided_num_list:
string_list.append(tmp1)
if will_deleted_list:
for tmp2 in will_deleted_list:
string_list.remove(tmp2)
return string_list


result = loop_helper(string_list)
result = loop_helper(result)

result = sorted(result)

for single_string in result:
print(single_string,end=" ")


第二题

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
import sys
# 给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号和小括号),括号可以嵌套,即括号里面可以出现数字和括号。
# 按照如下的规则对字符串进行展开,不需要考虑括号成对不匹配问题,用例保证括号匹配,同时用例保证每个数字后面都有括号,不用考虑数字后面没有括号的这种情况,即2a2(b)这种情况不用考虑。
# 1) 数字表示括号里的字符串重复的次数,展开后的字符串不包含括号。
# 2) 将字符串进行逆序展开。
# 输出最终展开的字符串。
# 输入描述:
# 输入一个长度小于100的字符串。
# 输出描述:
# 输出展开后的字符串。
# 示例1输入输出示例仅供调试,后台判题数据一般不包含示例
# 输入 abc3(A)
# 输出 AAAcba


def match_chars(char):
if char == "(":
return ")"
elif char == "[":
return "]"
else:
return "}"

def handle(strings):
struct_info = []
# 存储数字位置,数字数值,符号
for i in range(0,len(strings)):
if strings[i].isdigit():
struct_info.append([i,int(strings[i]),strings[i+1]])
new_strings = ""
# 从最内层的括号开始去除
for struct in struct_info[::-1]:
# 确定括号内的内容的起始和结束位置
start = struct[0] + 2
end = start + strings[start:].index(match_chars(struct[2]))
new_strings = ""
new_strings = new_strings + strings[:struct[0]]
for k in range(0,struct[1]):
new_strings = new_strings + strings[start:end]

new_strings = new_strings + strings[end+1:]
# 为了循环删去括号,把新值覆盖到旧值
strings = new_strings

return new_strings


line = sys.stdin.readline().strip()
result = handle(line)
print(result[::-1])

作者

Dawnnnnnn

发布于

2019-04-18

更新于

2022-07-06

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论