赞
踩
大家好,给大家分享一下牛客网华为软件测试题库,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
目录
自己研究的题解,也有借鉴评论区牛人思路,答案不唯一,仅供学习参考,也欢迎大家指出问题,共同学习
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000pythonturtle绘制树。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:hello nowcoder
输出:8
说明:最后一个单词为nowcoder,长度为8
- import sys
-
- a = input().split()
- print(len(a[-1]))
分析:利用split将字符串按空格拆分成一个列表,再利用len和[-1]取最后一个字符串的长度。
描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
数据范围: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中的个数。
描述
输入一个字符串,请按长度为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的意图在于可以循环输入,直到输入一个非十六进制数,退出并且不会报错)
描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 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)将其他进制转换为二进制。
描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 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))
分析:利用集合的不重复性,将字符串类型转换为集合类型,集合的长度即不同元素的数量。
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
数据范围: 0≤n≤2**30−1
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1
输入:1516000
输出:0006151
示例2
输入:0
输出:0
- a = input()
- b = a[::-1]
- print(b)
-
分析:利用Python自带的切片逻辑实现逆序输出。
描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过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()),有一个不是则重新输入,全部都是则逆序输出。
描述
给定 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) # 添加成列表
- list.sort() # 将列表里的字符串排序
- 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()用指定的字符连接列表元素。
描述
开发一个坐标计算工具, 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开头,借助异常捕获筛掉后两位不为数字的字符串。
描述
请解析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地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计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 = whole_mask.find('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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。