牛客网华为算法练习题-Python编写

本文提供了华为算法题目的Python解答示例,涵盖字符串处理、坐标计算、密码强度评估等多个方面,帮助读者理解并掌握基本算法及其实现。

前段时间闲的无聊,就在牛客网用Python对华为算法练习题进行的编写,随便写写。

#HJ1 计算字符串最后一个单词的长度,单词以空格隔开。
"""
word = input("请输入单词,并以空格间断:")
new_word = word.split(' ')
print(len(new_word[-1]))
"""

#HJ2 写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
"""
str_word = "asdfwereqqwdc"
check_word = 'e'
sum_num = 0
for i in str_word:
    if check_word == i:
        sum_num+=1
print(sum_num)
"""

#HJ3 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),
#对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
#请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
"""
from random import choice
number_n = [i+1 for i in range(0,1000)]
number_p = [choice(number_n) for i in range(0,20)]
number_o = []
for i in number_p:
    if i not in number_o:
        number_o.append(i)
number_o.sort()
print(number_o)
"""


#HJ4 连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理
"""
number_input = input("请输入字符串:")
if len(number_input) == 8:
    print(number_input)
elif len(number_input) < 8:
    print(number_input+'0'*(8-len(number_input)))
else:
    print(number_input[0:8])
    for i in number_input[8:]:
        print(i + '0' * (8 - len(i)))
"""


#HJ19 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
"""
file_record = open(r'D:\Project\Exercise\华为练习\record.txt','r')
last_name = []
for i in file_record.readlines():
    ii = i.split('\\')[-1]
    last_name.append(ii)
last_name_set = []
[last_name_set.append(i) for i in last_name if i not in last_name_set]
for i in last_name_set:
    op = 0
    for j in last_name:
        print(i)
        print(j)
        if i == j:
            op +=1
    print(i[-16:]+' '+str(op))
"""

#HJ20 判断密码强度
"""
# 判断密码长度
def passwd_len(str):
    if len(str) > 8:
        return True
    else:
        return False

# 判断密码组成
def passwd_consist(str):
    digit, upper, lower, other = 0, 0, 0, 0
    for i in str:
        if i.isdigit():
            digit = 1
        elif i.isupper():
            upper = 1
        elif i.islower():
            lower = 1
        else:
            other = 1
    sum = digit + upper + lower + other

    if sum >= 3:
        return True
    else:
        return False

# 判断密码重复
def passwd_rep(str):
    # 一次拿出一个长度为3的子串,则只需循环len(str)-3次即可遍历完字符串
    for i in range(len(str) - 3):
        # 如果相同子串的数量大于1,即子串重复,返回False
        if str.count(str[i:i + 3]) > 1:
            return False
    return True


while True:
    s = input('请输入密码:')
    if s == 'q':
        break
    if passwd_len(s) and passwd_consist(s) and passwd_rep(s):
        print('OK')
    else:
        print('NG')
"""


#HJ21 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈.接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
#假设渊子原来一个BBS上的密码为zvbo9441987, 为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,
#怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
#他是这么变换的,大家都知道手机上的字母: 1 - -1, abc - -2,def --3, ghi - -4, jkl - -5, mno - -6, pqrs - -7, tuv - -8
#wxyz - -9, 0 - -0, 就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,
#声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
"""
zmu = 'abcdefghijklmnopqrstuvwxyz'
zmu_s = {'2':[97,98,99],'3':[100,101,102],'4':[103,104,105],'5':[106,107,108],'6':[109,110,111],'7':[112,113,114,115],'8':[116,117,118],'9':[119,120,121,122]}
key_word = input('请输入需要转换密码:')
nek_word = ''
for i in key_word:
    if  i == 'Z':
        nek_word = nek_word + 'a'
    elif i.isupper():
        nek_word = nek_word + str(chr(ord(i.lower()) + 1))
    elif i.islower():
        for h in zmu_s.keys():
            if ord(i) in zmu_s[h]:
                nek_word=nek_word+h
    else:
        nek_word = nek_word + i
print('初始密码为:'+nek_word)
"""

#HJ17 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面
"""
x,y = 0,0
fx = ['A','D','W','S','a','d','w','s']
number = input('请输入坐标位置,以ADWS开头,两位数字结尾,坐标间以;隔开.如A12;S12:')
new_number = number.split(';')
for i in new_number:
    if i[0] in fx and len(i[1:]) == 2 and i[1:].isalnum():
        print(i)
        if i[0] == 'A' or i[0] == 'a':
            x+=-int(i[1:])
            #print(x)
        elif i[0] == 'D' or i[0] == 'd':
            x+=int(i[1:])
            #print(x)
        elif i[0] == 'W' or i[0] == 'w':
            y+=int(i[1:])
            #print(y)
        elif i[0] == 'S' or i[0] == 's':
            y += -int(i[1:])
            #print(y)
    else:
        continue
print(x,y)
"""

#HJ22 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,
# 喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,
# 最多可以换多少瓶汽水喝?
"""
empty_bottle = int(input("请输入空瓶数量:"))
drink = []
y=0
while empty_bottle >=3:
    # 获得商
    x = divmod(empty_bottle, 3)[0]
    # 获得余数
    y = divmod(empty_bottle, 3)[1]
    drink.append(x)
    empty_bottle = x + y
if  empty_bottle == 2:
    drink.append(1)
print(sum(drink))
"""

#HJ34 Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决
"""
import numpy as np
key_q = 'Ihave1nose2hands10fingers'
key_q_asc = []
key_q_last = ''
for i in key_q:
    if i.isalpha():
        key_q_asc.append(int(ord(i))) #将字母转化为数字
    elif i.isdigit():
        key_q_asc.append(i)
key_q_asc_arg = np.argsort(key_q_asc) #找到排序后的下标
for i in key_q_asc_arg:
    key_q_last+=key_q[i]
print(key_q_last)
"""


#HJ108 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
"""
def min_gb(a,b):
    number_min = 0
    while True:
        number_min +=1
        if number_min % a == 0 and number_min % b == 0:
            print('{}和{}的最小公倍数为:{}'.format(a,b,number_min))
            break
        else:
            continue
    pass
min_gb(5,1)
"""

#HJ63 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。
# 在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
#给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列
"""
dna_xl = 'AACTGTGCACGACCTGA'
number = int(input('输入查找字符串数:'))
dna_xl_dict = {}
for i in range(len(dna_xl)-number):
    cg_count = 0
    for j in dna_xl[i:i+number]:
        if j == 'C' or j == 'G':
            cg_count +=1
    dna_xl_dict[dna_xl[i:i+number]]=cg_count/len(dna_xl[i:i+number])
a = sorted(dna_xl_dict.items(),key=lambda x:x[1])
print(a[-1])
"""


#HJ60 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
"""
number = int(input('请输入一个大于2的偶数:'))
dict_s = {}
def sushu_check(x):
    for i in range(2,x):
        if (x%i) == 0:
            break
            return False
    else:
        return True
for j in range(1,number):
    result  =sushu_check(j)
    result_y = sushu_check(number-j)
    if result and result_y:
        if j < number-j:
            dict_s['[{},{}]'.format(j,number-j)] = abs(number-2*j)
        else:
            dict_s['[{},{}]'.format(number-j,j)] = abs(number-2*j)
a = sorted(dict_s.items(), key=lambda x: x[1])
print(a[0])
"""

#实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
#注意每个输入文件有多组输入,即多个字符串用回车隔开
"""
zfc = input('输入字符串,以空格分开:')
zfc_list = zfc.split(' ')
zfc_n = []
for z in zfc_list:
    time_z =[]
    zz = ''
    for i in z:
        time_z.append(z.count(i))
    for j in range(len(time_z)):
        if time_z[j] != sorted(time_z)[0]:
            zz+=z[j]
    zfc_n.append(zz)
print(zfc_n)
"""

#HJ84 找出给定字符串中大写字符(即'A'-'Z')的个数
"""
zfc = input('输入字符串:')
upper_count = 0
for i in zfc:
    if i.isupper():
        upper_count+=1
print('大写字母个数为:{}'.format(upper_count))
"""

#HJ 87密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
#一、密码长度:  5 分: 小于等于4 个字符  10 分: 5 到7 字符  25 分: 大于等于8 个字符
#二、字母:  0 分: 没有字母  10 分: 全都是小(大)写字母  20 分: 大小写混合字母
#三、数字:  0 分: 没有数字  10 分: 1 个数字  20 分: 大于1 个数字
#四、符号:  0 分: 没有符号  10 分: 1 个符号  25 分: 大于1 个符号
#五、奖励:  2 分: 字母和数字  3 分: 字母、数字和符号  5 分: 大小写字母、数字和符号
#最后的评分标准:  >= 90: 非常安全  >= 80: 安全(Secure) >= 70: 非常强  >= 60: 强(Strong)  >= 50: 一般(Average)  >= 25: 弱(Weak)  >= 0:  非常弱
"""
#密码长度判断
def lenth_check(str_check):
    if len(str_check) <= 4:
        return 5
    elif len(str_check) >= 8:
        return 25
    else:
        return 10
#密码字母判断
def zm_check(str_check):
    zm_count,upper_count,lower_count = 0,0,0
    for i in str_check:
        if i.isalpha():
            zm_count+=1
            if i.isupper():
                upper_count+=1
            else:
                lower_count+=1
    if zm_count == 0:
        return  0
    elif zm_count == upper_count or zm_count == lower_count:
        return 10
    elif zm_count>0 and upper_count> 0 and lower_count>0:
        return 20
#密码数字判断
def digit_check(str_check):
    digit_count = 0
    for i in str_check:
        if i.isdigit():
            digit_count +=1
    if digit_count == 0:
        return 0
    elif digit_count == 1:
        return 10
    else:
        return 20
#密码符号判断
def fh_check(str_check):
    string_fh= "~!@#$%^&*()_+-*/<>,.[]\/"
    fh_count = 0
    for i in str_check:
        if i in string_fh:
            fh_count+=1
    if fh_count == 0:
        return 0
    elif fh_count == 1:
        return 10
    else:
        return 20
#密码奖励判断
def jl_check(str_check):
    zm_fs = zm_check(str_check)
    digit_fs = digit_check(str_check)
    fh_fs = fh_check(str_check)
    if zm_fs == 10 and digit_fs >0 and fh_fs == 0:
        return 2
    elif zm_fs == 10 and digit_fs >0 and fh_fs >0:
        return 3
    elif zm_fs == 20 and digit_fs >0 and fh_fs >0:
        return 5
    else:
        return 0
#评分标准
def pf_st(str_check):
    lenth_fs = lenth_check(str_check)
    #print(lenth_fs)
    zm_fs = zm_check(str_check)
    #print(zm_fs)
    digit_fs = digit_check(str_check)
    #print(digit_fs)
    fh_fs = fh_check(str_check)
    #print(fh_fs)
    jl_fs = jl_check(str_check)
    #print(jl_fs)
    sum_fs = lenth_fs+zm_fs+digit_fs+fh_fs+jl_fs

    if sum_fs >= 70:
        if sum_fs >=90:
            print('VERY_SECURE')
        elif sum_fs >=80:
            print('SECURE')
        else:
            print('VERY_STRONG')
    elif sum_fs <= 60:
        if sum_fs ==0:
            print('VERY_WEAK')
        elif sum_fs <= 25:
            print('WEAK')
        elif sum_fs <=50:
            print('AVERAGE')
        else:
            print('STRONG')
if __name__ == '__main__':
    mm = input('输入密码:')
    pf_st(mm)
"""

#HJ81 题目标题:判断短字符串中的所有字符是否在长字符串中全部出现
"""
zfc = input('输入两个字符串,以空格隔开:')
zfc_list = zfc.split(' ')
if len(zfc_list[0]) > len(zfc_list[1]):
    max_zfc = zfc_list[0]
    min_zfc = zfc_list[1]
else:
    max_zfc = zfc_list[1]
    min_zfc = zfc_list[0]
if max_zfc.count(min_zfc)>0:
    print('true')
"""



"""
number = input().split('.')
if int(number[-1][0]) >= 5:
    print(int(number[0])+1)
else:
    print(number[0])
"""

"""
number = input()
new_number = ''
for i in range(len(number)-1,-1,-1):
    if number[i] not in new_number:
        new_number+=number[i]
print(new_number)
"""
"""
n = int(input('请输入要转换进制的数值:'))
# x = 2  # 转换为二进制,所以这里取x=2
b = []  # 存储余数
while True:  # 一直循环,商为0时利用break退出循环
    s = n // 2  # 商
    y = n % 2  # 余数
    b = b + [y]  # 每一个余数存储到b中
    print(b)
    if s == 0:
        break  # 余数为0时结束循环
    n = s
b.reverse()  # 使b中的元素反向排列
b = [str(i) for i in b ]
b = ['0b'] + b
print('该数字转换为二进制后是:')
print(''.join(b))
"""


empty_bottles = []
number = int(input())#输入行数
t = 1
while t <=3:
    empty_bottles.append(int(input()))
    t +=1
for empty_bottle in empty_bottles:
    drink = []
    empty_bottle = int(empty_bottle)
    y=0
    while empty_bottle >=3:
        # 获得商
        x = divmod(empty_bottle, 3)[0]
        # 获得余数
        y = divmod(empty_bottle, 3)[1]
        drink.append(x)
        empty_bottle = x + y
    if  empty_bottle == 2:
        drink.append(1)
    print(sum(drink),end='\n')
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的数理笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值