华为OD机试之刷题之路(每日一题)

说明:文章只写了题目标题,可以在牛客上搜索题目的完整描述:
https://www.nowcoder.com/ta/huawei
以下题目均为初级和中级难度(初级难度可能不会写思路)。

1. 整数与IP地址之间的转换:

思路:使用了bin(), int(), zfill()等内置函数,前两个函数能够实现十进制与二级制之间的转换,zfill函数能够进行补0操作
代码:
def ip_v_input(ip_v):
    if '.' in ip_v:
        res = ''
        ip_v_l = ip_v.split('.')
        for i in ip_v_l:
            i = bin(int(i))[2:].zfill(8)
            res += i
        print(int(res, 2))
    else:
        res = bin(int(ip_v))[2:].zfill(32)
        res_l = []
        for i in range(len(res)):
            res_l.append(res[i*8: (i+1)*8])
            if i >=3:
                break
        res_l = [str(int(i, 2)) for i in res_l]
        print('.'.join(res_l))
    
while True:
    try:
        ip_v = input().split()
        ip_v = ip_v[0]
        ip_v_input(ip_v)
    except:
        break

2. 坐标移动:

思路:判断每一个坐标输入是否合规,如果合规,再判断输入是以哪个字母开头,在各自分支进行对应运算
代码:
from types import CodeType
import re


x_value, y_value = 0, 0
str_l = input().split(';')

for item in str_l:
    flag = re.findall(r'^[ASWD]{1}[0-9]{1,2}$', item)
    if flag:
        nums = int(re.findall(r'(\d+)', item)[0])
        if item.startswith('A'):
            x_value -= nums
        elif item.startswith('D'):
            x_value += nums
        elif item.startswith('W'):
            y_value += nums
        elif item.startswith('S'):
            y_value -= nums
    else:
        continue
print(f"{x_value},{y_value}")

3. 密码验证合格:

思路:定义几个函数,来判定密码中是否含有数字,大小写字母;再定义一个判断是否有相同子串的函数
代码:
from os import ST_RELATIME
import re


def panduan1(s_str):
    flag = re.findall(r'[a-z]+', s_str)
    if flag:
        return True
    else:
        return False

def panduan2(s_str):
    flag = re.findall(r'[A-Z]+', s_str)
    if flag:
        return True
    else:
        return False

def panduan3(s_str):
    flag = re.findall(r'[0-9]+', s_str)
    if flag:
        return True
    else:
        return False

def panduan4(s_str):
    other_str = []
    for i in s_str:
        if panduan1(i) or panduan2(i) or panduan3(i):
            continue
        else:
            other_str.append(i)
    if other_str:
        return True
    else:
        return False

def check_str(s_str):
    for i in range(len(s_str)):
        str_1 = s_str[i: i+3]
        str_2 = s_str[i+3:]
        if str_1 in str_2:
            return False
    return True

while True:
    try:
        str_l = input().split()
        s_str = str_l[0]

        if len(s_str) <= 8:
            print('NG')
        else:
            res = [panduan1(s_str), panduan2(s_str), panduan3(s_str),panduan4(s_str)]
            res_num = 0
            for item in res:
                if item:
                    res_num += 1
            if res_num >= 3 and check_str(s_str):
                print('OK')
            else:
                print('NG')
    except:
        break

4. 删除字符串中出现次数最少的字符:

思路:将输入的字符串转为列表,去重,创建以列表元素为键,值为0的字典,遍历字符串,计算字符串中每个元素的个数,最后再做排序删除处理
代码:
s_str = input().split()
s_str = s_str[0]
str_l = []

for s in s_str:
    str_l.append(s)
 
str_l = list(set(str_l))
str_dir = {}
for i in str_l:
    str_dir[i] = 0

for i in str_l:
    for j in s_str:
        if i == j:
            str_dir[i] += 1

str_dir_sort = sorted(str_dir.items(), key = lambda x:x[1])
min_v = str_dir_sort[0][1]
remove_s = [] 
for i in str_dir_sort:
    if i[1] == min_v:
        remove_s.append(i[0])

new_s = ''
for i in s_str:
    if i not in remove_s:
        new_s += i

print(new_s)

5. 输入整型数组和排序标识,对其元素按照升序或降序进行排序

思路: 使用sorted()函数,默认为升序排列,当reverse=True为降序排列
def my_sort(num_l, flag):
    num_l = [int(i) for i in num_l]
    if flag == '0':
        new_l = sorted(num_l)
    else:
        new_l = sorted(num_l, reverse=True)
    new_l = [str(i) for i in new_l]
    print(' '.join(new_l))
while True:
    try:
        nums = input()
        num_l = input().split()
        flag = input()
        my_sort(num_l, flag)
    except:
        break

6. leetcode 1839 最长子字符串

题目链接:https://leetcode.cn/problems/longest-substring-of-all-vowels-in-order/
思路:
想法就是把所有的连续相同字符缩减为1, 然后另外给出一个计数器,当符合‘aeiou’的时候就更新最大值。
比如:aeiaaioaaaaeiiiiouuuooaauuaeiu
缩减为:aeiaioaeiouoauaeiu 和 [1,1,1,2,1,1,4,1,4,1,3,2,2,2,1,1,1,1]
显然缩减后的字符串只有一个'aeiou'在 6-10,计数得 4+1+4+1+3 = 13
# import re


# class Solution:
#     def longestBeautifulSubstring(self, word: str) -> int:
#         if len(word) < 5:
#             return 0
#         res = re.findall(r'a+e+i+o+u+', word)
#         if res:
#             if len(res) > 1:
#                 # res = sorted(res, key = lambda x:len(x))
#                 # res = res[-1]
#                 res = max([len(i) for i in res])
#                 # res_num = len(res)
#                 return res
#             else:
#                 res = res[0]
#                 res_num = len(res)
#                 return res_num
#         else:
#             return 0
# 以上被注释部分,只能通过部分用例,当测试word字符特别长的时候,会超时。
class Solution:
    def longestBeautifulSubstring(self, word: str) -> int:
        new_word = ''
        count = []
        for i in range(len(word)):
            if i == 0 or word[i] != word[i-1]:
                new_word += word[i]
                count.append(1)
            else:
                count[-1] += 1
        res = 0
        for i in range(len(new_word)-4):
            if new_word[i:i+5] == 'aeiou':
                res = max(res, sum(count[i:i+5]))
        return res

7. HJ46 截取字符串

input_str = input()
input_num = input()

print(input_str[0:int(input_num)])

8. 合并表记录:

思路:这个主要是考察输入输出,动态输入n组键值对;由于将相同索引的值合并,所以可以用字典来合并存储,索引若不是字典的键,则增加键,若已存在,则合并该索引对应的值。
nums = int(input())
list_a = []
for i in range(nums):
    list_a.append(list(map(int,input().split())))
# print(list_a)
dict_a = {}
for i in list_a:
    if i[0] not in dict_a:
        dict_a[i[0]] = i[1]
    else:
        dict_a[i[0]] += i[1]

dict_a = sorted(dict_a.items(), key=lambda x:x[0])
# print(dict_a)
for i in dict_a:
    print(i[0], i[1])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值