浅记录一下
只刷了一小部分,后面再补了
题源牛客-华为机考
HJ3 明明的随机数
将每一次输入的m值存储temp里时最好转换为整形,方便后面按小到大排序输出
解决重复数问题可以通过创建空数组,依次添加判断
n = int(input())
temp = []
ans = []
for i in range(n):
m = input()
temp.append(int(m))
for each in temp:
if each not in ans:
ans.append(each)
for i in sorted(ans):
print(i)
HJ4 字符串分隔
输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
示例1
输入:
abc
输出:
abc00000
解答大于8时通过循环输出,str[:8]:前八项输出,下标(0~7),输出后更新str—>第八项(下标)及第八项往后的字符串;
不足八位:补上8减字符串长度
str = input()
empty = ""
while len(str) > 8:
print(str[:8])
str = str[8:]
str = str + '0'*(8-len(str))
print(str)
HJ5 进制转换
思路一:
1、输入的字符串str1截取’0x’之后的字符放入str2,以str2生成的列表放入list1,方便转换后索引
2、A~F对应关系罗列字典(通过key索引value)
3、列表中字符转换整数(数字)存入list3
4、list3[-(i+1)],从最后一位开始计算,16^i
str1 = str(input())
str2 = str1[2:]
list1 = list(str2)
dict1 = {
'A':'10','B':'11','C':'12','D':'13','E':'14','F':'15'}
list2 = [dict1[i] if i in dict1 else i for i in list1]
list3 = []
Sum = 0
for i in list2:
list3.append(int(i))
for i in range(len(list3)):
Sum += list3[-(i+1)]*pow(16,i)
print(Sum)
二、python毕竟是python,简洁不花里胡哨,直接进制转换
int函数,第一个参数是一个字符串,第二个参数是字符串的进制
print(int(input(), 16))
HJ6 质数因子
假设输入的正整数num有质因数abcdef…
那么可以写成num = abcdf*…
若f是最大质因数,则num除去先前的质因子之后的数应该是小于等于mm
计算方法:
以180为例
从2开始,最小质因子开始循环
180能被2整除---->90
存放第一个质因子2---->res(后面需要join()函数拼接,需要装换为字符串)
再接着90往下循环,直到num不能被2整除,prfc+1
继续循环直到不能被3整除,prfc+1
因为前面整除2的数都被筛掉了,prfc = 4也不会满足第二个循环条件,其他类似
直到180//2//2//3//3 = 5 < 55 | num----->res[ ]
最后注意输出答案以空格为分开
join()函数用法
‘sep’.join(seq)
sep:分隔符,可以为’ , ‘、’ : '空格等等
seq:要连接的元素序列、字符串、元组、字典
num = int(input())
#primefactors质数因子
prfc = 2
res = []
while num >= prfc * prfc:
while num % prfc == 0:
num = num // prfc
res.append(str(prfc))
prfc +=1
if num > 1:
res.append(str(num))
print(' '.join(res))
HJ7 取近似值
n = float(input())
m = int(n)
if n - m >= 0.5:
print(m+1)
else:
print(m)
HJ8 合并表记录
代码来源大佬题解,这份答案写的挺好
split()默认两个参数,分别是分隔符和分隔数量,作用是将一个字符串按照分隔符分隔成一个list[ ]
split() 不传递参数时默认空格分隔,且无数量限制
get()函数在这里有两个参数,第一个是确定要分配值的键,第二个是拟定给键分配一个初值
get(key,0)-----获取key对应的value,并令初值为0
sorted()函数 sorted(list,key),key—排序规则
默认生成新的list(不覆盖原有排序),按key从小到大排,相当于sorted(list,reverse = False)
以题目示例为例
输入0 1时,以首项为键,后输入为值,以此构建字典索引
n = int(input())
arr = []
dict1 = {
}
for i in range(n):
arr = input().split()
key = int(arr[0])
value = int(arr[1])
dict1[key] = dict1.get(key,0) + value
for i in sorted(dict1):
print(i,dict1[i])
HJ9提取不重复的整数
n = str(input())
m = n[::-1]
temp = ''
for i in m:
if i not in temp:
temp += i
print(temp)
m = n[::-1] 切片逆序输出(不要用sorted翻转)
之后字符串+拼接输出
HJ10 字符个数统计
算法和上述的一些题目一样,就不赘述了
str1 = input()
temp = ""
count = 0
for i in str1:
if i not in temp:
temp += i
count += 1
print(count)
HJ11 数字颠倒
n = input()
print(n[::-1])
HJ12 字符串反转
代码同上
HJ13 句子逆序
所有单词之间用一个空格隔开
split()函数,不传入参数默认空格
[::-1]从后往前倒序重排
sentence = input().split()
arr = sentence[::-1]
ans = ''
for word in arr:
ans = ans + word + ' '
print(ans)
HJ14 字符串排序
n = int(input())
list1 = []
for i in range(n):
str1 = input()
list1.append(str1)
for word in sorted(list1):
print(word)
HJ15 求int型正整数在内存中存储时1的个数
以一个十进制数转二进制为例来分析过程
15
15/2=7…1
7/2=3…1
3/2=1…1
1/2=0…1
所以1111(从下往上)即15的二进制表达
n = int(input())
list1 = []
while n // 2 >= 0 and n != 0:
list1.append(n%2)
n = n // 2
print(list1.count(1))
或者使用进制转换函数
其他进制转换十进制可以用int(num,num所属的进制数)
如二进制转十进制
num = '0101'
print(int(num,2))
#输出5
若将十进制转换为其他有:
十进制—>十六进制 hex()
十进制—>八进制 oct()
十进制—>二进制 bin()
所以本题第二种写法
n = int(input())
m = str(bin(n))
print(m.count('1'))
HJ16 购物单
#购物单 进阶动态规划问题
#代码原文链接:https://blog.csdn.net/COCO56/article/details/124463397 原文大佬用了三种方法,代码非常漂亮
"""
输入 N m
从第二行到第m+1行,输入价格 重要度 主件/附件从属
v p q
50 5
20 3 5
20 3 5
10 3 0
10 2 0
10 1 0
输出
130
说明:
由第1行可知总钱数N为50以及希望购买的物品个数m为5;
第2和第3行的q为5,说明它们都是编号为5的物品的附件;
第4~6行的q都为0,说明它们都是主件,它们的编号依次为3~5;
所以物品的价格与重要度乘积的总和的最大值为10*1+20*3+20*3=130
"""
N , m = map(int,input().split())
main_obj = {
} #主件
accessory = {
} #附件
for i in range(1,m+1):
v,p,q = map(int,input().split())
if q == 0 : #是主件
main_obj[i] = [v,v*p] #写入主件价格,和购买改主件带来的满意度 //相当于{3:[10,30]}
else:
if q in accessory: #如果是附件
accessory[q].append([v,v*p]) #附件2 {5:[[20,60][20,60]]} 索引附件1的话:accessory[5][0][0]
else:
accessory[q] = [[v,v*p]] #列表存储 附件1{5:[[20,60]]}
dp = [0]*(N+1) #最后求dp[50],因为下标从0开始,第50项为dp[49],所以此处为N+1
#这里的main_parts.items(),输出为 {3:[10,30],4:[10,20],5:[10,10]}
#循环对应的key 和value为
# 3 [10,30]
# 4 [10,20]
# 5 [10,10]
for key,value in main_obj.items(): #遍历主件字典
price = [] #花费数额
satis = [] #获得的满意度
price.append(value[0]) # 购买该主件的价格 value[0]=main_obj[key][0][0]
satis.append(value[1]) # 花费该价格获得的满意度
if key in accessory: # 如果该主件还有附件
price.append(price[0] + accessory[key][0][0]) #主件加上附件1的价格
satis.append(satis[0] + accessory[key][0][1]) #主件加上购买附件1的满意度
if len(accessory[key]) > 1 : #如果有两个附件
price.append(price[0] + accessory[key][1][0]) #主件加上附件2的价格
satis.append(satis[0] + accessory[key][1][1]) # 主件加上购买附件2的满意度
price.append(price[0] + accessory[key][0][0] + accessory[key][1][0