Bootstrap

(python)牛客网(华为机试四)——较难

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

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
;