(python)牛客网(华为机试三)——中等

本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化。
其他题解合集:
(python)牛客网(华为机试一)——入门
(python)牛客网(华为机试二)——简单
(python)牛客网(华为机试四)——较难

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])):
                
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值