本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化。
其他题解合集:
(python)牛客网(华为机试一)——入门
(python)牛客网(华为机试二)——简单
(python)牛客网(华为机试三)——中等
目录
- HJ1 字符串最后一个单词的长度
- HJ2 计算字符个数
- HJ 明明的随机数
- HJ4 字符串分隔
- HJ13 句子逆序
- HJ17 坐标移动
- HJ20 密码验证合格程序
- HJ23 删除字符串中出现次数最少的字符串
- HJ24 合唱队
- HJ25 数据分类处理
- HJ29 字符串加解密
- HJ30字符串合并处理
- HJ32 密码截取
- HJ33 整数与ip的转换
- HJ39 判断两个IP是否属于同一子网
- HJ41 称砝码
- HJ42 学英语
- HJ51 输出单向链表中倒数第k个结点
- HJ58 输入n个整数,输出其中最小的k个
- HJ68 成绩排序
- HJ77 火车进站
- HJ80 整型数组合并
- HJ81 字符串字符匹配
- HJ92 在字符串中找出连续最长的数字串
- HJ93 数组分组
- HJ94 记票统计
- HJ95 人民币转换
- HJ96 表示数字
- HJ97 记负均正
- HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序
- HJ105 记负均正II
HJ1 字符串最后一个单词的长度
while True:
try:
print(len(input().split()[-1]))
except:
break
HJ2 计算字符个数
while True:
try:
str_data = input().strip().lower()
char_data = input().strip().lower()
print(str_data.count(char_data))
except:
break
HJ 明明的随机数
方1:set+sorted内置
while True:
try:
n = int(input().strip())
data_list = []
for i in range(n):
data_list.append(int(input().strip()))
data_list = sorted(list(set(data_list)))
for i in data_list:
print(i)
except:
break
方2:定义新数组变量去重
while True:
try:
n = int(input().strip())
data_list = []
new_list = []
for i in range(n):
data_list.append(int(input().strip()))
for i in data_list:
if i not in new_list:
new_list.append(i)
while new_list:
print(min(new_list))
new_list.remove(min(new_list))
except:
break
HJ4 字符串分隔
使用join()重建data
while True:
try:
data = input()
while data:
data = list(data)
if(len(data)<=8):
res = ''.join(data)+'0'*(8-len(data))
print(res)
break
else:
res = ''.join(data[:8])
print(res)
data = ''.join(data[8:])
except:
break
更快的方式:
while True:
try:
data = input().strip()
if 0<len(data)<=8:
print(data+'0'*(8-len(data)))
else:
n = len(data)//8
m = len(data)%8
for i in range(n):
print(data[i*8:(i+1)*8])
if m!=0:
print(data[n*8:]+'0'*(8-m))
except:
break
HJ13 句子逆序
import sys
for line in sys.stdin:
data = line.strip().split()
print(' '.join(data[::-1]))
HJ17 坐标移动
import sys
def solution(end,i):
x,y = end[0],end[1]
if i==' ':
return end
if len(i)<=1 or len(i)>=4 or i.count('A')+i.count('S')+i.count('W')+i.count('D')>=2:
return end
a = i[0]
b = int(i[1:])
if a=='A':
x -=b
elif a=='S':
y -=b
elif a=='W':
y += b
else:
x+=b
return [x,y]
for line in sys.stdin:
sym = line.strip().split(';')
end = [0,0]
for i in sym:
end=solution(end,i)
print(','.join([str(x) for x in end]))
HJ20 密码验证合格程序
import sys
def is_con2(data):
flag=[0,0,0,0]
for i in data:
if 'a'<=i<='z':
if flag[0]==1:continue
flag[0]=1
elif 'A'<=i<='Z':
if flag[1]==1:continue
flag[1]=1
elif '0'<=i<='9':
if flag[2]==1:continue
flag[2]=1
else:
if flag[3]==1:continue
flag[3]=1
if sum(flag)>=3:return 'OK'
return 'NG'
def is_con3(data):
len_d = len(data)
for i in range(3,int(len_d/2)):
for j in range(len_d-i):
str1=data[j:j+i]#将data分为前后两部分,看前一部分是否在后一部分中
str2=data[j+i:]
if str1 in str2:
return 'NG'
return 'OK'
def solution(data):
if len(data)>8:
if is_con2(data)=='OK':
if is_con3(data)=='OK':
return 'OK'
return 'NG'
for line in sys.stdin:
data = line.strip()
res = solution(data)
print(res)
HJ23 删除字符串中出现次数最少的字符串
import sys
for line in sys.stdin:
data = line.strip()
data_s = list(set(list(data)))
nums ={
}
min_c=len(data)
for i in data_s:
if min_c>data.count(i):
min_c=data.count(i)
nums[i] = data.count(i)
for k,v in nums.items():
if v==min_c:
data=data.replace(k,'')
print(data)
HJ24 合唱队
待补充
HJ25 数据分类处理
这到题题意描述也太难以理解了吧,甚至我是对着例子去扣的意思,而且我觉得题意有歧义,[相同的R<i>只需要输出索引小的以及满足条件的I,索引大的需要过滤掉]
好像也不是说R就要去重吧,我第一次读觉得是重复的R只输出对应满足条件的I中最小的下标的值。
总之要做的事情实际上就是对R去重排序,然后依次找出I里面包含R的数字的下标和值,当然当轮循环的tmp列表需要加上被包含的r和长度。然后最后输出的时候要在开头加上整体的总长度。
while True:
try:
res = []
I = input().split()[1:]
R = list