我是靠谱客的博主 眯眯眼朋友,最近开发中收集的这篇文章主要介绍(python)牛客网(华为机试三)——中等HJ5 进制转换HJ6 质数因子HJ8 合并表记录HJ9 提取不重复的整数HJ10 字符个数统计HJ14 字符串排序HJ16购物单(待补充)HJ21简单密码破解HJ26 字符串排序HJ34 图片整理HJ35蛇形矩阵HJ36 字符串加密HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ40 统计字符HJ43 迷宫问题(待补充)HJ45 名字的漂亮度HJ46 按字节截取字符串HJ48 从单链表中删除指定值的节点(待补充)HJ49 多线程HJ52 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化。
其他题解合集:
(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])):
                if res[i][j] !=0:
                    tmp.append(str(res[i][j]))
            print(' '.join(tmp))

HJ36 字符串加密

import sys
def solution(key_word,word):
    key_word_t = list(set(key_word.lower()))
    key_word_t.sort(key=key_word.index)
    l_dict,L_dict = get_dict(key_word_t)
    res = ''
    for i in word:
        try:
            res +=l_dict[i]
        except:
            res +=res+L_dict[i]
    return res
    
def get_dict(data):
    Data = [i.upper() for i in data]
    l_asc = ord('a')
    L_asc = ord('A')
    l_list = []
    L_list = []
    for i in range(26):
        l_list.append(chr(i+l_asc))
        L_list.append(chr(i+L_asc))
        if chr(i+l_asc) not in data:
            data.append(chr(i+l_asc))
        if chr(i+L_asc) not in Data:
            Data.append(chr(i+L_asc))
    l_dict = dict(zip(l_list,data))
    L_dict = dict(zip(L_list,Data))
    return l_dict,L_dict
while True:
    try:
        key_word = input().strip()
        word = input().strip()
        if key_word and word:
            res = solution(key_word,word)
            print(res)
    except:
        break

HJ38 求小球落地5次后所经历的路程和第5次反弹的高度

height = int(input().strip())
s = height
for i in range(4):
    height /= 2
    s += height*2
height /= 2
print(round(s,6))
print(round(height,6))

HJ40 统计字符

while True:
    try:
        data = input().strip()
        count_e = data.count(' ')
        count_d = 0
        count_l = 0
        count_o = 0
        for i in data:
            if i.isdigit():count_d+=1
            elif i.isalpha():count_l +=1
            else:
                if i != ' ':count_o +=1
        print(count_l)
        print(count_e)
        print(count_d)
        print(count_o)
    except:
    	break

HJ43 迷宫问题(待补充)

待补充

HJ45 名字的漂亮度

首先,对字符串中字符个数进行统计然后按照降序排序;
第二步,按照排序好的顺序赋值,值每次递减1,从26开始
第三步,遍历字符串,将字符的值累加计算

import sys

def get_dict(line):
    count_d = {}
    set_w = list(set(list(line)))
    for i in set_w:
        count_d[i] = line.count(i)
    count_d = sorted(count_d.items(),key= lambda item:item[1],reverse=True)
    key_w = [i[0] for i in count_d]
    value_w = [i for i in range(26,26-len(set_w),-1)]
    dict_t = dict(zip(key_w,value_w))
    return dict_t
while True:
    try:
        n = int(input().strip())
        for i in range(n):
            line = input()
            dict_t = get_dict(line)
            sum = 0
            for i in line:
                sum +=dict_t[i]
            print(sum)
    except:
        break

HJ46 按字节截取字符串

import sys
while True:
    try:
        data = input().strip()
        n = int(input().strip())
        print(data[:n])
    except:
        break

HJ48 从单链表中删除指定值的节点(待补充)

待补充

HJ49 多线程

在线程外部循环:博主这个太慢了T-T
在内部循环:无法保证输出顺序

import threading
class mythreads(threading.Thread):
    def __init__(self,ID):
        threading.Thread.__init__(self)
        self.ID = ID
    def run(self):
        if self.ID==1:
            print('A',end='')
        elif self.ID == 2:
            print('B',end='')
        elif self.ID == 3:
            print('C',end='')
        else:
            print('D',end='')   
while True:
    try:
        n = int(input().strip())
        for i in range(n):
            thread1 = mythreads(1)
            thread2 = mythreads(2)
            thread3 = mythreads(3)
            thread4 = mythreads(4)
            thread1.start()
            thread2.start()
            thread3.start()
            thread4.start()
            thread1.join()
            thread2.join()
            thread3.join()
            thread4.join()
        print() #需要输出换行,否则多用例情况不通过
    except:
        break

HJ52 计算字符间的距离

动态规划

while True:
    try:
        str1=input()
        str2=input()
        dp=[[x for x in range(len(str1)+1)] for y in range(len(str2)+1)]
        for i in range(1,len(str1)+1):dp[0][i]=i
        for j in range(1,len(str2)+1):dp[j][0]=j
        for i in range(1,len(str1)+1):
            for j in range(1,len(str2)+1):
                if str1[i-1]==str2[j-1]:
                    dp[j][i]=dp[j-1][i-1]
                else:
                    dp[j][i]=min(dp[j-1][i-1],dp[j-1][i],dp[j][i-1])+1
        print(dp[-1][-1])
    except:
        break

HJ55 挑7

while True:
    try:
        d = int(input().strip())
        count = 0
        for i in range(1,d+1):
            stri = str(i)
            if '7' in stri or i%7==0:
                count +=1
        print(count)
    except:
        break

HJ57 高精度整数加法

while True:
    try:
        a = int(input().strip())
        b = int(input().strip())
        print(a+b)
    except:
        break

HJ59 找出字符中第一个只出现一次的字符

def solution(a):
    list_a = list(set(list(a)))
    list_a = sorted(list_a,key=list(a).index)
    count = []
    for i in list_a:
        if a.count(i)==1:count.append(i)
    if count==[]:return -1
    for i in list_a:
        try:
            if i in count:return i
        except:
            pass
    return -1
while True:
    try:
        a = input().strip()
        print(solution(a))
    except:
        break

HJ60 查找组成一个偶数最接近的两个素数

注意:326 = 163+163,所以最下方循环中是i<=in_a/2

def solution(in_a):
    list_res = [i for i in range(2,in_a+1)]
    for i in reversed(list_res):
        tmp = 2
        while tmp<i:
            if i%tmp == 0:
                list_res.remove(i)
                break
            tmp+=1
    res = []
    for i in list_res:
        if i <=in_a/2 and in_a-i in list_res:res.append([i,in_a-i])
    res.sort(key=lambda item:item[1]-item[0])
    return res
while True:
    try:
        in_a = int(input().strip())
        res = solution(in_a)
        print(res[0][0])
        print(res[0][1])
    except:
        break

HJ63 DNA序列

res = [序列,max_GC-Ratio],每次只保存res,节约空间

def solution(data,n):
    len_d = len(data)
    max_res = 0
    res = [data[:n],max_res]
    for i in range(len_d-n):
        item_d = data[i:i+n]
        deta = (item_d.count('C')+item_d.count('G'))/len_d
        if max_res < max(max_res,deta):
            max_res = max(max_res,deta)
            res = [item_d,max_res]
    return res[0]
data = input().strip()
n = int(input().strip())
res = solution(data,n)
print(res)

HJ64 MP3光标位置

列表处理尤为重要:
注意以下特殊情况及一般情况列表左右边界的处理:
特殊1:当光标在歌1,但按键为U,此时跳到最后一首歌,且列表左右边界为如下:
l_t = -min(4,n)
r_t = n
特殊2:当光标在歌n,但按键为D,此时跳到第一首歌,且列表左右边界为如下:
l_t = 0
r_t = min(4,n)
一般情况下:
一般1:当光标在当前列表的首位,但按键为U,此时列表向上移动一位,左右边界各-1
一般2:当光标在当前列表的首位,但按键为U,此时列表向上移动一位,左右边界各+1
其余情况:列表不变
光标处理:注意在队首队尾的特殊情况下光标指向歌曲数目的正确更替即可。

def solution(n,data):
    def get_res(cur,c_data=''):
        if c_data=='':cur=1
        elif cur==1 and c_data=='U':cur = n
        elif cur==n and c_data=='D':cur = 1
        else:
            if c_data == 'U':cur -=1
            else:cur +=1
        return cur
    if n ==1:
        return [1],1
    total = [i for i in range(1,n+1)]
    l_t = 0
    r_t = min(4,n)
    res_list = total[l_t:r_t]
    res = get_res(0)
    for i in data:
        if i=='U' and res==1:
            l_t = -min(4,n)
            r_t = n
        elif i=='D' and res==n:
            l_t = 0
            r_t = min(4,n)
        else:
            if i=='U':
                if res==res_list[0]:
                    l_t -= 1
                    r_t -= 1
            else: #D
                if res==res_list[-1]:
                    l_t += 1
                    r_t += 1
        res_list = total[l_t:r_t]
        res = get_res(res,i)
    return res_list,res
while True:
    try:
        n = int(input().strip())
        data = input().strip()
        res_list,res = solution(n,data)
        res_list = [str(i) for i in res_list]
        print(' '.join(res_list))
        print(res)
    except:
        break

HJ65 查找两个字符串a,b的最长公共子串

def solution(a,b):
    if len(a)==0 or len(b)==0:return ''
    if len(a)>len(b):a,b = b,a 
    if a in b:return a
    len_a = len(a)
    while len_a>0:
        for i in range(len(a)-len_a+1):
            a_t = a[i:i+len_a]
            if a_t in b:
                return a_t 
        len_a-=1
    return ''
while True:
    try:
        a = input().strip()
        b = input().strip()
        res = solution(a,b)
        print(res)
    except:
        break

HJ67 24点游戏算法

迭代方法。注意total有小数时返回false

def solution(data,total=24):
    if len(data)==1:return data[0]==total
    if total<0 or int(total) != total: return False
    for i in range(len(data)):
        l = data[:i]+data[i+1:]
        v = data[i]
        if solution(l,total+v)or solution(l,total-v)or solution(l,total*v)or solution(l,total/v):
            return True
    return False
while True:
    try:
        data = list(map(int,input().split()))
        res = solution(data)
        if res == True:print('true')
        else: print('false')
    except:
        break

HJ69 矩阵乘法

def solution(M1,M2,r1,c,r2):
    M = []
    for i in range(r1):
        M.append([])
        for j in range(r2):
            tmp=0
            for n in range(c):
                tmp += M1[i][n]*M2[n][j]
            M[i].append(tmp) 
    return M
while True:
    try:
        r1 = int(input())
        c = int(input())
        r2 = int(input())
        M1 = []
        M2 = []
        for i in range(r1):M1.append(list(map(int,input().split()))) 
        for i in range(c):M2.append(list(map(int,input().split())))
        res = solution(M1,M2,r1,c,r2)
        for i in range(len(res)):
            tmp = ' '.join(map(str,res[i]))
            print(tmp)
    except:
        break

HJ70 矩阵乘法计算量估计

纪念一下本题为博主在牛客网的第一个98%,可太菜了QAQ
在这里插入图片描述
注意:本题计算方式:结果矩阵元素个数*每个元素所需计算次数。由于博主用的python,python没有专门的栈结构,所以用列表来模拟栈结构。

def get_count_size(A_data,B_data):
    m1,n1 = A_data[0],A_data[1]
    n2 = B_data[1]
    return m1*n2*n1,[m1,n2]

def solution(in_d,in_list):
    count = 0
    #模拟栈
    stack = []
    for i in in_d:
        if i == '(':pass
        elif 'A'<=i<='Z':
            stack.append(in_list[0])
            in_list.pop(0)
        else:#右括号
            if len(stack)>=2:
                B = stack.pop()
                A = stack.pop()
                tmp,size = get_count_size(A,B)
                stack.append(size)
                count+=tmp
    return count
        
while True:
    try:
        n = int(input())
        in_list = []
        for i in range(n):in_list.append(list(map(int,input().split())))
        in_d = input().strip()
        res = solution(in_d,in_list)
        print(res)
    except:
        break

HJ71 字符串通配符(动态规划待补充)

可使用动态规划、递归
待补充

HJ88 扑克牌大小

if-else大法好

Standard = ['3','4','5','6','7','8','9','10','J','Q','K','A','2','joker','JOKER']
def solution(in_l1,in_l2,in_1,in_2):
    def is_valid(in_l1,in_l2):
        f = []
        for i in [in_l1,in_l2]:
            if len(i)==len(set(i)):
                if 'joker' in i and len(i)==2:flag=6#王
                else:flag = 1#个子
            elif len(i)==2 and len(set(i))==1:flag = 2#对子
            elif len(i)==3:flag=3#三个
            elif len(i)==4:flag=4#炸弹
            else: flag=5#顺子
            f.append(flag)
        if 4 in f or 6 in f:
            return True,f
        elif f[0]==f[1]:return True,f
        else:return False,f
    tmp,flag = is_valid(in_l1, in_l2)
    if not tmp: return'ERROR'
    if flag[0] in [1,2,3] and 4 not in flag and 6 not in flag:
        #个子 对子 三个看牌面
        index1=Standard.index(in_l1[0])
        index2=Standard.index(in_l2[0])
        return in_1 if index1>=index2 else in_2
    elif 4 in flag or 6 in flag:
        #炸弹 对王
        if 6 in flag:return in_1 if flag[0]==6 else in_2
        #一个炸弹
        elif 4 in flag and flag[0]!=flag[1]:return in_1 if flag[0]==4 else in_2
        #都是炸弹
        else: return in_1 if Standard.index(in_l1[0])>= Standard.index(in_l2[0]) else in_2
    else:
        #顺子 比较最小牌面
        min_1 = [Standard.index(i) for i in in_l1]
        min_2 = [Standard.index(i) for i in in_l2]
        return in_1 if min_1>=min_2 else in_2
            
[in_1,in_2] = input().strip().split('-')
in_l1 =in_1.split()
in_l2= in_2.split()
res = solution(in_l1,in_l2,in_1,in_2)
print(res)

HJ90 合法IP

非法:小于0,大于256,有空格,超过三位数

import sys
for line in sys.stdin:
    line = line.strip()
    data = line.split('.')
    flag=1
    for i in data:
        if ' ' in i or len(i)>=4 or '-' in i or int(i)>256:
            print('NO')
            flag=0
            break
    if flag==1:print('YES')

HJ96 表示数字

import sys
def solution(data,i_start=0,res=''):
    def is_no_digit(tmp):
        for i in tmp:
            if i.isdigit():return False
        return True
    if i_start == len(data):return res
    for i in reversed(range(len(data)-i_start)):
        tmp = data[i_start:i_start+i+1]
        if tmp:
            if tmp.isdigit(): #全是数字
                res+=('*'+tmp+'*')
                break
            elif is_no_digit(tmp):#不包含数字
                res += tmp
                break
    return solution(data,i_start+i+1,res)
            
for line in sys.stdin:
    data = line.strip()
    res = solution(data)  
    print(res)

HJ98 自动售货系统(待补充)

题目太长太长,后面有空再写

HJ99 自守数

import sys
for line in sys.stdin:
    data = int(line.strip())
    count=0
    for n in range(data+1):
        if str(n*n).endswith(str(n)):count+=1
    print(count)

HJ102 字符统计

巩固排序sort sorted用法

import sys
def solution(data):
    res = {}
    d_set = set(list(data))
    for item in d_set:
        num_i = data.count(item)
        if num_i not in res.keys():
            res[num_i] = []
        res[num_i].append(item)
    for item in res.keys():
        res[item] = sorted(res[item],key=lambda i:ord(i))#ASCII升序
    return sorted(res.items(),key=lambda item:item[0],reverse=True)#次数降序
        
for line in sys.stdin:
    data = line.strip()
    res = solution(data)
    for v_list in res:
        for i in v_list[1]:
            print(i,end='')
    print()

HJ103Redraiment的走法

最长上升子序列问题,动态规划

def solution(n,data):
    dp = [1 for i in range(len(data))]
    res=0
    for i in range(n):
        for j in range(i):
            if data[i]>data[j]:
                dp[i]=max(dp[i],dp[j]+1)
        res = max(res,dp[i])
    return res
while True:
    try:
        n,data = int(input()),list(map(int,input().strip().split()))
        res = solution(n,data)
        print(res)
    except:
        break

HJ107 求解立方根

牛顿迭代法 f(x)=x^3-y,f(x)=0的解: xn+1=xn-f(xn)/f’(xn) (本题y=216)

n=float(input())
e=0.0001#精度设置
x=n#初始化解为输入值
while abs(x**3-n)>e:
    x = x-(x**3-n)/(3*x*x)
print(round(x,1))

青古の每篇一歌
《是风动》
你是我身外,化白云任去来
推开孤城万里,吹渡春风几千载

最后

以上就是眯眯眼朋友为你收集整理的(python)牛客网(华为机试三)——中等HJ5 进制转换HJ6 质数因子HJ8 合并表记录HJ9 提取不重复的整数HJ10 字符个数统计HJ14 字符串排序HJ16购物单(待补充)HJ21简单密码破解HJ26 字符串排序HJ34 图片整理HJ35蛇形矩阵HJ36 字符串加密HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ40 统计字符HJ43 迷宫问题(待补充)HJ45 名字的漂亮度HJ46 按字节截取字符串HJ48 从单链表中删除指定值的节点(待补充)HJ49 多线程HJ52 的全部内容,希望文章能够帮你解决(python)牛客网(华为机试三)——中等HJ5 进制转换HJ6 质数因子HJ8 合并表记录HJ9 提取不重复的整数HJ10 字符个数统计HJ14 字符串排序HJ16购物单(待补充)HJ21简单密码破解HJ26 字符串排序HJ34 图片整理HJ35蛇形矩阵HJ36 字符串加密HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ40 统计字符HJ43 迷宫问题(待补充)HJ45 名字的漂亮度HJ46 按字节截取字符串HJ48 从单链表中删除指定值的节点(待补充)HJ49 多线程HJ52 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部