本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化。
其他题解合集:
(python)牛客网(华为机试一)——入门
(python)牛客网(华为机试二)——简单
(python)牛客网(华为机试四)——较难
题目
- HJ5 进制转换
- HJ6 质数因子
- HJ8 合并表记录
- HJ9 提取不重复的整数
- HJ10 字符个数统计
- HJ14 字符串排序
- HJ16购物单(待补充)
- HJ21简单密码破解
- HJ26 字符串排序
- HJ34 图片整理
- HJ35蛇形矩阵
- HJ36 字符串加密
- HJ38 求小球落地5次后所经历的路程和第5次反弹的高度
- HJ40 统计字符
- HJ43 迷宫问题(待补充)
- HJ45 名字的漂亮度
- HJ46 按字节截取字符串
- HJ48 从单链表中删除指定值的节点(待补充)
- HJ49 多线程
- HJ52 计算字符间的距离
- HJ55 挑7
- HJ57 高精度整数加法
- HJ59 找出字符中第一个只出现一次的字符
- HJ60 查找组成一个偶数最接近的两个素数
- HJ63 DNA序列
- HJ64 MP3光标位置
- HJ65 查找两个字符串a,b的最长公共子串
- HJ67 24点游戏算法
- HJ69 矩阵乘法
- HJ70 矩阵乘法计算量估计
- HJ71 字符串通配符(动态规划待补充)
- HJ88 扑克牌大小
- HJ90 合法IP
- HJ96 表示数字
- HJ98 自动售货系统(待补充)
- HJ99 自守数
- HJ102 字符统计
- HJ103Redraiment的走法
- HJ107 求解立方根
HJ5 进制转换
import sys
for data in sys.stdin:
data = data.split()[0]
print(int(data,16))
HJ6 质数因子
此题外循环边界界定尤其重要:tmp*tmp<=data
def solution(data):
tmp = 2
while(tmp*tmp<=data):
while (data % tmp == 0):
print(tmp, end=' ')
data //= tmp
tmp+=1
if data -1:#当data本身就是一个质数时,data此时就是原本的data,需要输出
print(data,end=' ')
data = int(input())
solution(data)
HJ8 合并表记录
此题要求按key值数值大小排序输出,因此可以直接以int信key值保存,然后最后对字典的键值列表排序。若存为string型key值,排序会按字符串排序。
import sys
dict_res = {
}
for line in sys.stdin:
line = line.split()
if len(line)==1: continue
k,v = int(line[0]),line[1]
if k not in dict_res.keys():
dict_res[k] = v
else:
dict_res[k] = str(int(dict_res[k])+int(v))
for i in sorted(dict_res.keys()):
print(str(i),dict_res[i])
HJ9 提取不重复的整数
data = input().strip()
data = data[::-1]
res = []
for i in data:
if i not in res:
res.append(i)
print(i,end='')
HJ10 字符个数统计
此题要求重复输入的不做计算,因此设置备忘录进行筛选
import sys
vis = []
for data in sys.stdin:
data = data.strip()
if data not in vis:
vis.append(data)
data = set(list(data))
print(len(data))
HJ14 字符串排序
n = input()先把首个数字排掉
import sys
n = input()
res = []
for line in sys.stdin:
line = line.strip()
res.append(line)
for i in sorted(res):
print(i)
HJ16购物单(待补充)
待补充
HJ21简单密码破解
import sys
KEY = {
'1':'1','abc':'2','def':'3','ghi':'4','jkl':'5',
'mno':'6','pqrs':'7','tuv':'8','wxyz':'9','0':'0'}
def solution(data):
res = ''
if data in ['1','0'] or 'a'<=data<='z':
for key in KEY.keys():
if data in key:
res = KEY[key]
return res
elif 'A'<=data<='Z':
if data == 'Z':
res = 'a'
else:
res = chr(ord(data.lower())+1)
return res
else:
return data
for data in sys.stdin:
res = ''
if data !='\n':
data = data.strip()
for i in data:
res += solution(i)
print(res)
HJ26 字符串排序
首先,将字母和非字母分开,char_list存放字母(方便进行排序),tmp存放非字母,该是字母的位置存放False,将每个tmp存入res;
第二步,对char_list排序,排序时大写字母按照小写进行排序对应原题中按照输入顺序排序(即不会影响顺序);
第三步,对res中的值按照下标进行填充,非字母的保持原样,字母的从char_list中取;
第四步,输出结果。
import sys
for line in sys.stdin:
line = line.split()
res = [] #结果集
total_res = [] #最终结果
char_list = [] #存放字母
for item in line:
tmp = [] #存放每组单词 False/非字母
for i in item:
if i.isalpha():
char_list.append(i)
tmp.append(False)
else:
tmp.append(i)
res.append(tmp)
#对char_list排序
char_list.sort(key = lambda c:c.lower())
#填充
for item in range(len(res)):
for i in range(len(res[item])):
if not res[item][i]:#Flase
res[item][i] = char_list[0]#对应char_list中的第一个元素,下方填充后即可删除
char_list.pop(0)
for item in res:
i_tmp = ''.join(item)
total_res.append(i_tmp)
print(' '.join(total_res))
HJ34 图片整理
(原题题干注明使用c,python过于草率了)
import sys
for line in sys.stdin:
line = line.strip()
print(''.join(sorted(line)))
HJ35蛇形矩阵
首先按行给首位赋值;然后按列遍历赋值。赋值公式如代码:
import sys
def solution(n):
N = [[0 for i in range(n)]for j in range(n)]
N[0][0] = 1
for i in range(n): #给每行首位赋值
if i !=0:
N[i][0] = N[i-1][0]+i
for j in range(1,n): #按列遍历,首列除外
for i in range(n-1):
if i+j<n:
#每个元素是左下角元素加1
N[i][j] = N[i+1][j-1]+1
return N
for line in sys.stdin:
if line!='\n':
line = line.strip()
res = solution(int(line))
for i in range(len(res)):
tmp = []
for j in range(len(res[i])):