华为牛客网python考试题库及答案

亲爱的朋友们,今天我们要讨论,牛客网华为软件测试题库 牛客网华为机试题答案,让我们开始吧!

目录

一、字符串(知识点)

HJ1 字符串最后一个单词的长度(简单)

HJ2 计算某字符出现次数(简单)

HJ4 字符串分隔(简单)

HJ5 进制转换(简单)

HJ10 字符个数统计(简单)

HJ11 数字颠倒(简单)

HJ12 字符串反转(简单)

HJ14 字符串排序(简单)

HJ17 坐标移动(中等)

HJ18 识别有效的IP地址和掩码并进行分类统计(较难)

自己研究的题解,也有借鉴评论区牛人思路,答案不唯一,仅供学习参考,也欢迎大家指出问题,共同学习

一、字符串(知识点)

HJ1 字符串最后一个单词的长度(简单)

描述

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000python源码库。(注:字符串末尾不以空格为结尾)

输入描述:

输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:

输出一个整数,表示输入字符串最后一个单词的长度。

示例1

输入:hello nowcoder

输出:8

说明:最后一个单词为nowcoder,长度为8

import sys

a = input().split()
print(len(a[-1]))

分析:利用split将字符串按空格拆分成一个列表,再利用len和[-1]取最后一个字符串的长度。

HJ2 计算某字符出现次数(简单)

描述

写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

数据范围:1≤n≤1000 

输入描述:

第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为格)。

输出描述:

输出输入字符串中含有该字符的个数。(不区分大小写字母)

示例1

输入:ABCabc

           A

输出:2

import sys

st1 = input().lower()
st2 = input().lower()
print(st1.count(st2))

分析:将两次输入都小写化(lower),以至于不用区分大小写,再利用st1.count(st2),意为st2在st1中的个数。

HJ4 字符串分隔(简单)

描述

输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;

长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

输入描述:

连续输入字符串(每个字符串长度小于等于100)

输出描述:

依次输出所有分割后的长度为8的新字符串

示例1

输入:abc

输出:abc00000

import sys

#   :0<8s  格式左对齐 右补0 输出8个字符串
while True:
    try:
        l = input()
        for i in range(0, len(l), 8):  #间隔8
            print("{:0<8s}".format(l[i:i+8]))
    except:
        break

分析:主要利用一个循环,遍历每8个字符的开头,为了输出0-8,8-16……,补0利用初始化函数format,:0<8s意为左对齐 右补0, 输出8个字符。(利用while和try的意图在于可以循环输入,直到输入一个非十六进制数,退出并且不会报错)

HJ5 进制转换(简单)

描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

数据范围:保证结果在 1≤n≤2**31−1 

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

输入:0xAA

输出:170

import sys

while True:
    try:
        a = input()
        print(int(a,16))
    except:
        break

分析:利用int()将其他进制转换为十进制--->int(a,16)十六进制转换为十进制,int(a,8)八进制转换为十进制,int(a,2)二进制转换为十进制。bin(a)将其他进制转换为二进制。

HJ10 字符个数统计(简单)

描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

数据范围:1≤n≤500 

输入描述:

输入一行没有空格的字符串。

输出描述:

输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

示例1

输入:abc

输出:3

示例2

输入:aaa

输出:1

str = input()
lst = set(str)
print(len(lst))

分析:利用集合的不重复性,将字符串类型转换为集合类型,集合的长度即不同元素的数量。

HJ11 数字颠倒(简单)

描述

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

数据范围:  0≤n≤2**30−1 

输入描述:

输入一个int整数

输出描述:

将这个整数以字符串的形式逆序输出

示例1

输入:1516000

输出:0006151

示例2

输入:0

输出:0

a = input()
b = a[::-1]
print(b)

分析:利用Python自带的切片逻辑实现逆序输出。

HJ12 字符串反转(简单)

描述

接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:

输入一行,为一个只包含小写字母的字符串。

输出描述:

输出该字符串反转后的字符串。

示例1

输入:abcd

输出:dcba

while True:
    try:
        str = input()
        for i in str:
            # islower()判断字符串中是否含有一个小写字母,所以利用循环逐个判断
            if not i.islower():  
                break  # 如果有一个不为小写字母,则重新输入
        if i.islower():  # 如果最后一个i为小写字母,那么代表全都为小写字母,则逆序输出
            print(str[::-1])
    except:
        break

分析:for循环逐个判断字符串是否为小写字母(利用islower()),有一个不是则重新输入,全部都是则逆序输出。

HJ14 字符串排序(简单)

描述

给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围:1≤n≤1000  ,字符串长度满足 1≤len≤100 

输入描述:

输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:

数据输出n行,输出结果为按照字典序排列的字符串。

示例1

输入:

9
cap
to
cat
card
two
too
up
boat
boot

输出:

boat
boot
cap
card
cat
to
too
two
up
# 法一:
n = int(input())
list = []
for i in range(n):
    str = input()  # 一行一行输入字符串
    list.append(str)  # 添加成列表
()  # 将列表里的字符串排序
for j in list:
    print(j)  # 一行一行输出字符串

# 法二:
n = int(input())
list = []
for i in range(n):
    list.append(input())
print("\n".join(sorted(list)))

分析:利用列表sort()排序,可以指定比较的形式和顺序,没有返回值。join()用指定的字符连接列表元素。

HJ17 坐标移动(中等)

描述

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。

下面是一个简单的例子 如:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

处理过程:

起点(0,0)

+   A10   =  (-10,0)

+   S20   =  (-10,-20)

+   W10  =  (-10,-10)

+   D30  =  (20,-10)

+   x    =  无效

+   A1A   =  无效

+   B10A11   =  无效

+  一个空 不影响

+   A10  =  (10,-10)

结果 (10, -10)

数据范围:每组输入的字符串长度满足 1≤n≤10000  ,坐标保证满足 −2**31≤x, y≤2**31−1  ,且数字部分仅含正数

输入描述:

一行字符串

输出描述:

最终坐标,以逗号分隔

示例1

输入:A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出:10,-10

示例2

输入:ABC;AKL;DA1;

输出:0,0

str = input()
list = str.split(";")  # 按分隔符分割字符串,返回列表
x = 0
y = 0
for i in list:
    # 如果不满足2、3的长度就跳过(满足:A11)
    if len(i) not in [2, 3]:
        continue
    try:  #避免类型转换错误,如果不能转换就跳转到except,直接pass
        direction = i[0].lower()
        step = int(i[1:])

        # 判断每个操作的长度是否合规、是否为空、方向是否正确
        if i != '' and direction in ['a', 'd', 's', 'w']:
            if direction == 'a':
                x -= step
            elif direction == 'd':
                x += step
            elif direction == 's':
                y -= step
            elif direction == 'w':
                y += step
    except:
        continue  # 如果异常就跳过这条
print(f'{x},{y}')

分析:抓住过滤的条件,非空、字符串长度、以asdw开头,借助异常捕获筛掉后两位不为数字的字符串。

HJ18 识别有效的IP地址和掩码并进行分类统计(较难)

描述

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址从1.0.0.0到126.255.255.255;

B类地址从128.0.0.0到191.255.255.255;

C类地址从192.0.0.0到223.255.255.255;

D类地址从224.0.0.0到239.255.255.255;

E类地址从240.0.0.0到255.255.255.255

私网IP范围是:

从10.0.0.0到10.255.255.255

从172.16.0.0到172.31.255.255

从192.168.0.0到192.168.255.255

子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)

(注意二进制下全是1或者全是0均为非法子网掩码)

注意:

1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略

2. 私有IP地址和A,B,C,D,E类地址是不冲突的

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。

请参考帖子处理循环输入的问题。

输出描述:

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

示例1

输入:

10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0

输出:

1 0 1 0 0 2 1

说明:

10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2;
1.0.0.1~255.0.0.0是无误的A类地址;
192.168.0.2~255.255.255.0是无误的C类地址且是私有IP;
所以最终的结果为1 0 1 0 0 2 1        

示例2

输入:

0.201.56.50~255.255.111.255
127.201.56.50~255.255.111.255

输出:

0 0 0 0 0 0 0

说明:

类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略         
# HJ18 识别有效的IP地址和掩码并进行分类统计
import sys


# 检查IP是否合规,不合规返回false
def check_ip(ip):
    # 先划分部位
    ip_list = ip.split('.')
    # ip长度有4位,且每一位不为空,不满足条件就返回FALSE
    if len(ip_list) != 4 or '' in ip_list:
        return False
    # 遍历每一位,判断范围是否属于0-255(最基本的规则)
    for i in ip_list:
        try:  # 如果输入非数字,异常->FALSE不合规
            if int(i) < 0 or int(i) > 255:  # 不属于这个范围的就返回FALSE
                return False
        except:
            return False
    return True


# 检查掩码是否合规,不合规返回false
def check_mask(mask):
    # 先判断掩码是否合规(按IP的方法)
    if not check_ip(mask):
        return False
    # 全255和全0的都视为非法
    if mask == '255.255.255.255' or mask == '0.0.0.0':
        return False
    # 划分掩码部位,将每部分都转化为二进制
    mask_list = mask.split('.')
    mask_bit = []
    for i in mask_list:
        try:
            j = bin(int(i))[2:]  # 每段都转换为二进制(j:'ob11111111'),所以还要去掉前面两个二进制前缀'ob'
            mask_bit.append(j.zfill(8))  # zfill(n)返回n个长度的字符串,右对齐,左填充0
        except:
            return False
    whole_mask = ''.join(mask_bit)  # 将4段二进制连接起来的字符串
    # 查第一个0的位置
    whole_find_0 = ('0')
    # 查最后一个1的位置
    whole_rfind_1 = whole_mask.rfind('1')
    # 如果最后一个1之后就是第一个0的位置,则表示0前面都是1,掩码合规
    if whole_rfind_1 + 1 == whole_find_0:
        return True
    else:
        return False


# 检查IP分类是否为私网(已经满足IP规格)
def check_private_ip(ip):
    try:
        # 划分部位
        ip_list = ip.split('.')
        if ip_list[0] == '10':
            return True
        elif ip_list[0] == '172' and 16 <= int(ip_list[1]) <= 31:
            return True
        elif ip_list[0] == '192' and ip_list[1] == '168':
            return True
        else:
            return False
    except:
        return False


ip_class_dic = {
    'a': 0,
    'b': 0,
    'c': 0,
    'd': 0,
    'e': 0,
    'error': 0,
    'private': 0
}

# 从标准输入读取多行数据,直到遇到EOF结束标志(ctrl+D结束输入),可在控制台与用户交互并读取用户的输入
for line in sys.stdin:  # 输入一行读一行,如果输入有异常(不满足输入格式的话,例如没有掩码)则结束循环输入
    try:  # 如果出现异常则结束循环(结束输入)
        ip = line.split('~')[0]  # IP
        mask = line.split('~')[1]  # 掩码(此时会将换行符\n算进来,但没关系,后面是用数字计算的)

        # 1.1先判断IP地址是否合规
        if check_ip(ip):
            # 2.1如果合规就按第一部分进行分类
            first = int(ip.split('.')[0])
            # 2.2这两个不计
            if first == 0 or first == 127:
                continue  # 表示进行下一个输入
            # 2.3再判断掩码是否合规,如果掩码也合规,则判断IP类型
            if check_mask(mask):
                # 3.1先判断是否为私有IP(必须判断),是则私网+1
                if check_private_ip(ip):
                    ip_class_dic['private'] += 1
                # 3.2再判断是abcde类型中的哪种(必须判断)
                if 0 < first < 127:
                    ip_class_dic['a'] += 1
                elif 127 < first <= 191:
                    ip_class_dic['b'] += 1
                elif 192 <= first <= 223:
                    ip_class_dic['c'] += 1
                elif 224 <= first <= 239:
                    ip_class_dic['d'] += 1
                elif 240 <= first <= 255:
                    ip_class_dic['e'] += 1
            # 2.4如果(IP合规)掩码不合规,则error+1
            else:
                ip_class_dic['error'] += 1
        # 1.2如果IP不合规,则error+1
        else:
            ip_class_dic['error'] += 1
    except:
        break

# 最后将字典里的值循环输出
for i in ip_class_dic.values():
    print(i, end=' ')

分析:(该题较难,掌握字符串的基本应用即可。)

主要思路:循环输入,分割变量,判断ip、掩码、私网、类型

1.检查是否符合ip规格,否->error+1,是则2,不计直接continue

2.检查是否符合掩码规格,否->error+1,是则3

3.判断是否私网,判断是哪个类型的地址。(分别判断)否->error+1

4.用字典来表示变量

注:ip和掩码都符合规格才算是合法地址,才分类,有一个不符合规格就是非法+1(先判断ip,不合法直接error+1,如果ip合法,再判断掩码,掩码不合法直接error+1,如果掩码合法,再看ip地址是属于哪个类型)

拓展:sys.stdin和文件读取的区别

# 读取普通文件
with open('data'.txt) as f:
    lines = f.readlines()
    for line in lines:
        print(line)


# 读取标准输入
import sys

for line in sys.stdin:  # 循环读取,输入一行读一行
    print(line)

for line in sys.stdin.readlines():  # 输入一堆文本,一行一行读
    print(line)


原文地址1:https://blog.csdn.net/weixin_51754286/article/details/134668942
参考资料:python中用turtle画一个圆形 https://blog.csdn.net/SXIAOYAN_/article/details/140061099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值