华为题库刷题记录

浅记录一下

只刷了一小部分,后面再补了

题源牛客-华为机考

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 < 5
5 | 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])   #主件+附件1+附件2价格
            satis.append(satis[0] + accessory[key][0][1] + accessory[key][1][1])  # 主件+附件1+附件2的满意度
    # 从最大金额到0,购买物的价格是10的整数倍,减少循环  下边的循环比较b站毒蛇大叔的视频讲的挺好
    for j in range(N,-1,-10):
        for i,_ in enumerate(price):   #枚举当前存储的价格,返回升序后的索引下标i, _ 是返回的价格,通过下标i可以获取,所以就随意一些了
            if j - price[i] >= 0:       #当前现金可以买下,类似01背包问题
                dp[j] = max(dp[j],dp[j - price[i]] + satis[i]) #枚举,获得索引值和遍历的对象
print(dp[N])
HJ17 坐标移动

关键在于判断合法坐标,是否为AWSD+数字(两位以内组成)
isdigit()
判断单个字符是否为数字
判断字符串中是否仅含有数字
如str = A10
str[1:].isdigit()--------返回True
返回用的format()函数,前边的{0},{1}----相当于x , y的占位符,指定位置映射x , y的值

#坐标coordinate
coor = input().split(';')
x,y = 0,0
for each in coor:
    if 2 <=len(each) <= 3:
        if each[:1] == 'A' and each[1:].isdigit():
            x -= int(each[1:])
        if each[:1] == 'D' and each[1:].isdigit():
            x += int(each[1:])
        if each[:1] == 'W' and each[1:].isdigit():
            y += int(each[1:])
        if each[:1] == 'S' and each[1:].isdigit():
            y -= int(each[1:])
print('{0},{1}'.format(x,y))
HJ21 简单密码

ord()----将字符转换为ascll码值,ascll+1来实现移位,在通过函数lower()转换小写,或者直接lower()再通过ascll码+1移位,注意最后一位‘Z’–90,但91不是‘a’,a的ascll码97,注意一下
小写字母和数值转换可以把输入的字典key搬出来遍历,再写入对应key的value
本例最后一个if有点多余,直接temp +=i应该也一样

code = input()
temp = ''
dict1 = {'abc':2,'def':3,'ghi':4,'jkl':5,'mno':6,'pqrs':7,'tuv':8,'wxyz':9}
for i in code:
    if 65 <= ord(i) <= 89:
        temp += chr(ord(i)+1).lower()
    if ord(i) == 90:
        temp += 'a'
    for key in dict1:
        if i in key:
            temp += str(dict1.get(key))
    if i.isdigit():
        temp += i
print(temp)
HJ22 汽水瓶

每三个空瓶可以换一批汽水
但即使只有两个空瓶,可以通过借一个空瓶换一瓶汽水,喝完再还一个空瓶
所以这道题最优解可以看作有多少份‘两个空瓶’,就可以喝多少汽水
即n/2

while True:
    try:
        n = int(input())
        if n == 0:
            break
        else:
            print(n//2)
    except:
        break
HJ23 删除字符串中出现次数最少的字符

通过遍历输入字符串,每扫描一次重复的key,value+1
通过min()函数取出最小value
再遍历str1中的字符作为key来索引所对应的value是否最小
如aabcddd,a在dict1中为{‘a’:2},取出最小字符,由于要输出的不是最少
再遍历一遍str1,将不属于最少字符提取出来,这里也可以用replace()函数替换
str1.replace(需要替换的值,替换后的值)

str1 = input()
dict1 = {}
ans = ''
str2 = ''
for i in str1:
    if i in dict1:
        dict1[i] = dict1.get(i) + 1
    else:
        dict1[i] = 1
Min = min(dict1.values())
for i in str1:
    if dict1[i] == Min:
        ans += i
for each in str1:
    if each not in ans:
        str2 += each
print(str2)
str1 = input()
dict1 = {}
for i in str1:
    if i in dict1:
        dict1[i] = dict1.get(i) + 1
    else:
        dict1[i] = 1
Min = min(dict1.values())
for i in str1:
    if dict1[i] == Min:
        str1 = str1.replace(i,'')   #使用replace函数替换最少字符再覆盖str1
print(str1)
HJ24 合唱队
def left_LICS(nums):
    dp = [1]*len(nums)   #若左边没有比自己小的数,则为自己本身,所以初始值为1
    for i in range(len(nums)):
        for j in range(i):      # 遍历自己左侧的数
            if nums[i] > nums[j] and dp[i] < dp[j] + 1:   #明确dp[i]的含义,第i位时所能获得的最长序列
                dp[i] = dp[j] + 1       #i位左侧的数比第i位小,并且左侧的这个数所能达到的最长序列+1能使得dp[i]此时为最长序列
    return dp                          #如[2,8,9,3,5,7,10] i=6时,序列有[2,3,5,7,10]和[2,8,9,10],当前者最长所以dp[i] = 5
                                       #[1,1,1,1,1,1,1]-->[1,2,3,2,3,4,5]
n = int(input())
nums = list(map(int,input().split(' ')))
left_lines = left_LICS(nums)   #自左向右递增
right_lines = left_LICS(nums[::-1])[::-1]  #只右向左递增,可以看作倒序的序列做自左向右递增,再将结果倒序
sum_lines = []          #合唱队形长度序列,需要出列的人数即总人数减去合唱人数
for i in range(len(left_lines)):
    sum_lines.append(left_lines[i] + right_lines[i] -1)   #第i位自身加了两次,需要-1
print(n-max(sum_lines))
HJ27 查找兄弟单词
while True:
    try:
        list1 = input().split()
        n = int(list1[0])
        word_list = list1[1:-2]
        x_target = list1[-2]
        k = int(list1[-1])
        count = 0
        bro_word = []
        for i in word_list:
            if i != x_target and sorted(i) == sorted(x_target):
                count += 1
                bro_word.append(i)
        print(count)
        bro_word.sort()
        print(bro_word[k-1])
    except:
        break
HJ35 蛇形矩阵

思路
1 3 6 10
2 5 9
4 8
7
可以旋转变成
1
2 3
4 5 6
7 8 9 10
然后截取每一行的最后一个数作为一行输出
代码
第一个for循环生成矩阵matr[[0],[0][0],[0][0][0],[0][0][0][0]]
第二个for循环—行
第三个for循环—列
从1开始依次赋值

n = int(input())
matr = []   
count = 0
list1 = []
ans = []
for i in range(1,n + 1):
    matr.append([0]*i)
for i in range(n):
    for j in range(i+1):
        count += 1
        matr[i][j] += count
for i in range(n):
    for each in matr:      #遍历matr
        if each:				#当each非空时为真
            list1.append(each.pop(-1))    #取出最后一项后删除
    ans.append(' '.join(map(str,list1)))  #join不支持int,map将str函数作用list内每一个元素上,得到一个新的list返回
    list1 = []
for line in ans:
    print(line)
    
HJ40 统计字符
str1 = input()
space = 0
alp = 0
num = 0
els = 0
for i in range(len(str1)):
    if str1[i].isalpha():
        alp += 1
    elif str1[i].isdigit():
        num += 1
    elif str1[i] == ' ':
        space += 1
    else:
        els += 1
print(alp)
print(space)
print(num)
print(els)
HJ45 名字的漂亮度

给每个字母赋值,求最大漂亮度
出现最多的字母赋值26,以此类推
比如asdfadadsa a:4 d:3 s:2 f:1 要使得漂亮度最大,则adsf分别赋值26 25 24 23

while True:
    try:
        n = int(input())
        for i in range(n):
            name = input()
            dict1 = {}
            beauty = 0
            #每个字母出现的次数
            for j in name:
                if j not in dict1:
                    dict1[j] = name.count(j)
            #根据出现次数降序排列
            times = sorted(dict1.values(),reverse=True)
            flag = 0
            for j in times:
                beauty += (26-flag)*j
                flag +=1
            print(beauty)

    except:
        break
HJ48 从单向链表中删除指定值的节点
while True:
    try:
        num = input().split()
        head = num[1]
        nodes = num[2:-1]   #从输入的第3项到倒数第二项为所有节点
        #两两一组,每一组的第一个节点插入到第二个节点后面
        dele = num[-1]   #最后一项为要删除的节点值
        list_ans = [head]  #单项链表头节点
        for i in range(0,len(nodes),2):
            first_node = nodes[i]   #每一组的第一个节点
            index1 = list_ans.index(nodes[i+1])+1 #i+1即该组第二个节点,获取第二个节点右侧下标值
            list_ans.insert(index1,first_node)
        list_ans.remove(dele)
        print(' '.join(list_ans))
    except:
        break
HJ53 杨辉三角变形
# n 1  2  3  4  5  6  7  8  9  10
#  -1 -1  2  3  2  4  2  3  2  4
n = int(input())
arr = [2,3,2,4]
if n <= 2:
    print(-1)
elif n % 4 == 3:
    print(2)
elif n % 4 == 0:
    print(3)
elif n % 4 == 1:
    print(2)
else:
    print(4)
HJ54 表达式求值
while True:
    try:
        str1 = input()
        valid_str = '+-*/()1234567890'
        if len(str1) > 100:
            print("超出规定长度")
        else:
            for i in str1:
                if i not in valid_str:
                    print("字符不合法")
            print(eval(str1))
    except:
        break
            
HJ56 完全数计算
while True:
    try:
        n = int(input())
        count = 0
        for i in range(1,n+1):
            Sum = 0
            half_i = i//2
            for j in range(1,half_i + 1):
                if i % j == 0:
                    Sum +=j
            if Sum == i:
                count += 1
        print(count)
    except:
        break
HJ58 输入n个整数,输出其中最小的k个
n = input().split()
i = int(n[0])
temp = []
m = input().split()
for i in m:
    temp.append(int(i))
temp = sorted(temp)
for i in range(int(n[1])):
    print(temp[i],end=' ')

HJ60 查找组成一个偶数最接近的两个素数
def sushu(num):
    if num == 1:
        return False
    if num == 2:
        return True
    list1 = []   #list1为空,说明时素数
    for i in range(2,num):
        if num % i == 0:
            list1.append(i)
    if not list1:
        return True
    else:
        return False

while True:
    try:
        n = int(input())
        num = n // 2
        #从中间往后遍历
        for i in range(num):
            a = num - i
            b = num + i
            if sushu(a) and sushu(b):
                print(a)
                print(b)
                break
    except:
        break
HJ61 放苹果
# m:苹果数量,n:盘子数量
#边界条件  m=0 func(m,n)=1;  n=0,func(m,n)=0; n=1,func(m,n)=1
#如果 m < n , 即使每个盘子放一个苹果,还有m-n个盘子空着,所有分法为func(m,m)
#如果 m >= n
#至少有一个空盘,则分法有func(m,n-1)
#没有空盘,则分法为,func(m-n,n)
def func(m,n):
    if m == 0:
        return 1
    elif n == 0:
        return 0
    elif n == 1:
        return 1
    elif m < n:
        return func(m,m)
    elif m >= n:
        return func(m,n - 1) + func(m - n,n)
m,n = map(int,input().strip().split())
print(func(m,n))
HJ62 查找输入整数二进制中1的个数
while True:
    try:
        n = int(input())
        print(bin(n).count('1'))
    except:
        break
HJ72 百钱买百鸡问题
# 公,母,雏 a,b,c
#a + b + c = 100
#5a + 3b +c/3 = 100
#合并消掉一项,得出两项关系
#即 14a + 8b = 200 ----> b = 25 - 7/4*a
#a必须是4的倍数
while True:
    try:
        n = input()
        a=0
        i = 1
        while 25 - 7/4*a >=0:
            b = 25 - 7/4*a
            c = 100 - b - a 
            print(int(a),int(b),int(c))
            a = i*4
            i += 1
    except:
        break
    

HJ73 计算日期到天数转换
import datetime
while True:
    try:
        date = list(map(int,input().split()))
        year,month,day = date[0],date[1],date[2]
        date = datetime.datetime(year,month,day)
        ans_day = date.strftime('%j').lstrip('0')
        #%j:返回当天是当年的第几天,如第81天-->080
        #lstrip()根据传入参数从左边开始删除参数内容
        print(ans_day)
    except:
        break
HJ76 尼科彻斯定理
num = int(input())
list1 = []
n = num*num
str1 = []   #join()只能连接字符串
if num % 2==0:
    for i in range(1,num,2):
        list1.append(n - i)
        list1.append(n + i)
else:
    for i in range(2,num,2):
        list1.append(n - i)
        list1.append(n + i)
    list1.append(n)
list1 = sorted(list1)
for i in range(len(list1)):
    str1.append(str(list1[i]))
print('+'.join(str1))
HJ80 整型数组合并
while True:
    try:
        first_num = int(input())
        first_list = list(map(int,input().split()))
        sec_num = int(input())
        sec_list = list(map(int,input().split()))
        list1 = []
        ans = []
        for each in first_list:
            if each not in list1:
                list1.append(each)
        for each in sec_list:
            if each not in list1:
                list1.append(each)
        list1 = sorted(list1)
        for i in range(len(list1)):
            ans.append(str(list1[i]))
        print(''.join(ans))
    except:
        break
HJ81 字符串字符匹配
str1 = input()
str2 = input()
flag = 0
for i in str1:
    if i in str2:
        flag += 1
if flag == len(str1):
    print('true')
else:
    print('false')
HJ82 将真分数分解为埃及分数
#80/110  55+22+2+1 = 80
while True:
    try:
        n,m = map(int,input().split('/'))
        n *= 10
        m *= 10
        #遇到分母为素数,乘以10可以有利于分解,分解出来能被分母整除的数存入list1
        list1 = []
        str1 = ''
        #倒序遍历会比较快,从n~0,range最后取到1结束
        while n:
            for i in range(n,0,-1):
                if m % i == 0:
                    list1.append(f'1/{int(m/i)}')
                    n -= i
                    break
        print('+'.join(list1))
    except:
        break
HJ83 二维数组操作
while True:
    try:
        m,n = map(int,input().split())
        x1,y1,x2,y2 = map(int,input().split())
        i_m,i_n = int(input()),int(input())
        x,y = map(int,input().split())
        #1,数据表行列范围都是[0,9],若满足输出'0',否则输出'-1'
        print('0' if(0<= m <= 9) and (0<= n <= 9) else '-1')
        #2,交换的坐标行列数要在输入的表格大小行列数范围[0,m)x[0,n)内
        print('0' if(0 <= x1 < m) and (0 <= y1 < n) and (0<= x2 <m) and (0 <= y2 < n) else '-1')
        # 3.1,插入的x坐标要在 [0, m) 范围内
        print('0' if(0 <= i_m < m) and (m < 9) else '-1')
        # 3.2,插入的y坐标要在 [0, n) 范围内
        print('0' if(0 <= i_n < n) and (n<9) else '-1')
        # 4,要检查的位置 (x,y) 要在 [0, m)x[0, n) 内
        print('0' if(0 <= x < m) and (0 <= y < n) else '-1')
    except:
        break
HJ84 统计大写字母个数
while True:
    try:
        str1 = input()
        str2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        count =0
        for i in str1:
            if i in str2:
                count += 1
        print(count)
    except:
        break
HJ85 最长回文子串
while True:
    try:
        str1 = input()
        list1 = [] #存放每一次遍历的回文串长度
        for i in range(len(str1) - 1):
            for j in range(i+1,len(str1)+1):
                if str1[i:j] == str1[i:j][::-1]:
                    list1.append(j-i)
        if list1 != '':
            print(max(list1))

    except:
        break
HJ86 求最大连续bit数
n = int(input())
m = str(bin(n))
list1 = []
count = 0
for i in m:
    if i == '1':
        count += 1
    else:
        count = 0
    list1.append(count)
print(max(list1))
HJ87 密码强度等级
str1 = input()
str2 = ''  #存放str1中的字母
count = 0  #计算str1中的数字个数
count2 = 0 #计算str1中符号个数
point_len = 0  #长度得分
point_alp = 0  #字母得分
point_num = 0  #数字得分
point_symbol = 0 #符号得分
point_award = 0  #奖励得分
total = 0      #合计得分
#长度得分
for i in str1:
    if len(str1) <= 4:
        point_len = 5
    elif 5 <=len(str1) <= 7:
        point_len = 10
    elif len(str1) >= 8:
        point_len = 25
#字母得分
for i in str1:
    if i.isalpha():
        str2 += i 
if str2 == '':
    point_alp = 0
elif str2.isupper() or str2.islower():
    point_alp =10
else:
    point_alp =20
#数字得分
for i in str1:
    if i.isdigit():
        count += 1
if count == 0:
    point_num = 0
elif count == 1:
    point_num = 10
else:
    point_num = 20
#符号得分
for i in str1:
    if 0x21 <=ord(i) <= 0x2F or 0x3A <= ord(i) <= 0x40 or 0x5B <= ord(i) <= 0x60 or 0x7B <=ord(i) <= 0x7E:
        count2 += 1
if count2 == 0:
    point_symbol = 0
elif count2 == 1:
    point_symbol = 10
else:
    point_symbol =25
#奖励
if point_alp > 0 and point_num > 0 and point_symbol == 0:
    point_award = 2
elif 0 < point_alp <20 and point_num > 0 and point_symbol > 0:
    point_award = 3
elif point_alp == 20 and point_num == point_num > 0 and point_symbol > 0:
    point_award = 5
total = point_len + point_alp +point_num + point_symbol + point_award
if total >=90:
    print('VERY_SECURE')
elif total >= 80:
    print('SECURE')
elif total >= 70:
    print('VERY_STRONG')
elif total >= 60:
    print('STRONG')
elif total >= 50:
    print('AVERAGE')
elif total >= 25:
    print('WEAK')
else:
    print('VERY_WEAK')
HJ91 走方格的方案数
#递归算法,走到坐标(n,m),可以从(n,m-1)往右走,也可以从(n-1,m)往下走
num = list(map(int,input().split()))
n = num[0]
m = num[1]
def func(n,m):
    if n == 0 or m == 0:
        return 1
    return func(n,m-1) + func(n-1,m)
print(func(n,m))
#动态规划算法
#二维数组的创建 横坐标是m,纵坐标是n
while True:
    try:
        n,m = map(int,input().split())
        dp = [[1 for _ in range(n+1)] for _ in range(m+1)]
        for i in range(1,m+1):
            for j in range(1,n+1):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        print(dp[m][n])
    except:
        break
HJ94 候选人投票
while True:
    try:
        nums = int(input())   #候选人数的人数
        names = input().split()   #候选人名字
        vote_nums = int(input())  #投票人人数
        vote = input().split()    #输入投票
        dict1 = {}
        Invalid = 0
        for i in names:       
            if i not in dict1:
                dict1[i] = 0      #建立字典
        for i in vote:
            if i in dict1:
                dict1[i] = dict1.get(i) +1   #与字典中key相同时获取value 然后+1
            else:
                Invalid += 1
        for i in dict1:
            print(i + ' : ' + str(dict1[i]))
        print('Invalid' + ' : ' + str(Invalid))
    except:
        break
HJ96 表示数字
str1 = input()
str_pre = ''      #已经遍历过得字符写入
ans = ''
for i in str1:
    if i.isdigit():   #如果第i位是数字
        if str_pre.isdigit() != True:   #如果第i位前一位不是数字
            ans += '*'                  #输出结果字符加'*' 
        ans += i                        #然后再将i写入输出ans
    else:                               #如果第i位不是数字
        if str_pre.isdigit():           #但第i位的前一位是数字
            ans += '*'                  #数字后方加'*'
        ans += i                        #再写入i
    str_pre = i                         #作为下一次循环的前一位判断
if str1[-1].isdigit():                  #补上最后一项
    ans += '*'
print(ans)
HJ97 记负均正
while True:
    try:
        n = int(input())
        nums = list(map(int,input().split()))
        count = 0
        list1 = []    #存放正整数
        for i in nums:
            if i < 0:
                count += 1
            if i > 0:
                list1.append(i)
        if len(list1) == 0:
            list1 = [0]
        print('{0} {1}'.format(count,round(sum(list1)/len(list1),1)))
    except:
        break
HJ99 自守数
n = int(input())
m = 0
count = 0
for i in range(n+1):
    m = i*i 
    if str(m)[-len(str(i)):] == str(i):
        count +=1
print(count)
HJ100 等差数列
#朴素求解
while True:
    try:
        n = int(input())
        list1 =[]
        temp = 2
        if n == 0:
            break
        for i in range(1,n+1):
            if i == 1:
                list1.append(2)
            else:
                list1.append(temp)
            temp += 3
        print(sum(list1))
    except:
        break
#an = a1 + (n-1)d     Sn = n*(a1+an)/2=n*a1 + n*(n-1)d/2
while True:
    try:
        n = int(input())
        total = 0
        if n == 0:
            break
        total = n*2 + n*(n-1)*3/2
        print('%.0f'%total)
    except:
        break
HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序
while True:
    try:
        n = int(input())
        nums = list(map(int,input().split()))
        list1 = []
        flag = input()
        if flag == '0':
            nums = sorted(nums)
        if flag == '1':
            nums = sorted(nums,reverse=True)
        for i in nums:
            list1.append(str(i))
        print(' '.join(list1))
    except:
        break
HJ102 字符统计
while True:
    try:
        str1 = input()
        dict1 = {}
        for i in str1:
            if i in dict1:
                dict1[i] += 1
            else:
                dict1[i] = 1  
        #sorted(dict1.items(),key=lambda x:(-x[1],x[0]))
        #dict_items([('a', 1), ('d', 2), ('f', 3)])
        #sorted(iterable,key,reverse) 参数key可以指定根据那个字段进行排序
        #key=lambda 元素: 元素[1] 根据元素第2位进行排序  注:前加负号为倒序
        #key=lambda x:(-x[1],x[0]),先根据元素第2位逆序,再根据元素第1位顺序
        for key,value in sorted(dict1.items(),key=lambda x:(-x[1],x[0])):
            print(key,end='')
    except:
        break
            
HJ105 记负均正II
#关键在于处理多组输入
#当输入最后一行并回车后,按组合键ctrl+D,表示EOF,即End of File、文件尾的意思
#input()函数遇到EOF的异常,Python的异常处理机制将捕获到此异常,执行except中语句
count = 0
int_num = []  #positive integer
while True:
    try:
        n = int(input())
        if n < 0:
            count += 1
        else:
            int_num.append(n)
    except EOFError:
        print(count)
        if len(int_num) == 0:
            print('0.0')
        else:
            print(round(sum(int_num)/len(int_num),1))
        break
HJ106 字符逆序
while True:
    try:
        str1 = input()
        print(str1[::-1])
    except:
        break
HJ107 求解立方根(二分查找)
while True:
    try:
        n = float(input())
        e = 0.0001
        low = min(-1,n)
        high = max(1,n)
        mid = (low + high)/2
        while abs(mid**3 - n) >= e:
            if mid**3 < n:
                low = mid
            else:
                high = mid
            mid = (low + high)/2
        print(round(mid,1))
    except:
        break
HJ108 求最小公倍数
#直接挨个遍历容易超时,那就减少遍历次数
#从最小的输入值开始遍历,步长为最小输入值
while True:
    try:
        n,m = map(int,input().split())
        for i in range(min(n,m),n*m + 1,min(n,m)):
            if i % n == 0 and i % m == 0:
                print(i)
                break
    except:
        break
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值