华为机考80-108

80、字符串匹配
题目要求:

判断短字符串是否在长字符串中出现

注意:虽然题目说只会输入两个字符串,但是不加while还是会错,所以应该吧while设为框架

ps:字符串的 in 操作,只有切片完全一致才为true,乱序false

while True:
    try:
        x = input()
        y = input()
        flag = True
        for s in x:
            flag = flag and (s in y)
        print('true' if flag else 'false')
    except:
        break

81、真分数化为埃及分数

埃及分数:分子为1的分数,就是要求将分数拆为多个分子为1的分式
方法:

分数的贪心算法,准确的算法表述应该是这样的:

1、设某个真分数的分子为a,分母为b;

2、把c=(b/a+1)作为分解式中第一个分数的分母;

3、将a-b%a作为新的a;

4、将b*c作为新的b;

5、如果a等于1,则最后一个分数为1/b,算法结束;

6、如果a大于1但是a能整除b,则最后一个分数为1/(b/a),算法结束;

否则重复上面的步骤。

while True:
    try:
        a = input().split('/')
        up = int(a[0])
        down = int(a[1])
        res = ''  # 返回值
        while up != 1:
            if down%(up-1) == 0:
                res = res + '1/' + str(down//(up-1)) + '+'
                up = 1
            else:
                q = down//up
                res = res + '1/'+ str(q+1) + '+'
                up = up - down%up
                down = down*(q+1)
                if down%up == 0:
                    down = down//up
                    up = 1
        res = res + '1/' + str(down)
        print(res)
    except:
        break

82、列表操作

主要是二维表格的增删查改

增加:append、insert

删除:remove(value)、pop(index)

m,n=list(map(int,input().split()))  # map:函数 迭代器
exchange=list(map(int,input().split()))

83、大写字母的个数

‘A’.isupper()

‘A’ <= s <= ‘Z’


84、最大回文子串的长度

理论支持:每当增加一个新的字母,最大回文串的长度只能增加1或者2,不可能增加更多,并且,新的最大回文串必然要包含这个字母!



所以,从头到尾扫描字符串,每增加一个新的字符,判断以这个字符结尾,且长度为maxLen+1或者maxLen+2的子串是否为回文,如果是,

更新最大回文子串。代码如下:

def longestPalindrome(s):
    if s==s[::-1]:return len(s)
    maxLen=0
    for i in range(len(s)):
        if i-maxLen>=1 and s[i-maxLen-1:i+1]==s[i-maxLen-1:i+1][::-1]:
            maxLen+=2
            continue
        if i-maxLen>=0 and s[i-maxLen:i+1]==s[i-maxLen:i+1][::-1]:
            maxLen+=1
    return maxLen
while True:
    try:
        a=input()
        if a:
            print(longestPalindrome(a))
 
 
    except:
        break

85、最长重复值

输入一个byte数字,唬人的,就是input然后int处理一下。输出最长连续的1的个数

直接用 in

while True:
    try:
        n = int(input())
        n2 = bin(n)[2:]
        li = list(range(len(n2)))
        li.reverse()
        for i in li:
            s = '1' * (i+1)
            if s in n2:
                print(len(s))
                break
    except:
        break

86、密码强度等级

知识点:acall匹配(数字、大写字母、小写字母、符号)

isupper()、islower()、isalpha()、isdigit()
也可以直接用大于小于等判定

核心部分如下:

alpha_list = []
digit_list = []
symbol_list = []
for i in s:
    if i.isalpha():
        alpha_list.append(i)
    if i.isdigit():
        digit_list.append(i)
    else:
        symbol_list.append(i)
l=[0,0]
for i in alpha_list:
    if ord(i) in range(97,123):
        l[0]=1
    if ord(i) in range(65,91):
        l[1]=1

87、扑克牌大小

逻辑问题,典型的华为考题,有时间可以做一下


88、24点游戏标准答案是用穷举的办法,但是我觉得可以用背包来求解


89、ip合法性检查

方法1:正则匹配

方法2: 点分之后和0、255比较

while True:
    try:
        nums = list(map(int, input().split(".")))
        flag = 0
        for i in range(len(nums)):
            if nums[i] < 0 or nums[i] > 255:
                flag = 1
            else:
                pass
        if flag == 0:
            print("YES")
        else:
            print("NO")
    except:
        break

90、动规棋盘路径搜索

91、简单动规


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值