我是靠谱客的博主 眯眯眼朋友,这篇文章主要介绍(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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部