华为机试/笔试联系题Python3-刷题-笔记(身边按照这个刷了一遍的都拿到了HW offer, 可以用作很好的练习材料)
使用建议:
(1) 打开华为机试牛客网链接https://www.nowcoder.com/exam/oj/ta?tpId=37
(2)基础不太好的,先对着敲一遍1-10题,把自己不懂的拿出来,对照着几个Python的知识点看看,
(3)然后自己不看答案,再刷一遍,熟悉编程思路和调试过程,回头对照着看看和理解别人的思路是否有值得学习的地方
基础好的,刷完前10题后,后面挑10道中等的和难题刷一下就可以了,其他的简单题对着B站上的视频看一下总结下思路,一般就可以高分通过了。视频本人看的是一个有点小忧伤的程序员发布的,叫做“汉东大当家”的博主,他的【001:005题视频】链接如下:https://www.bilibili.com/video/BV1mt4y1m7Ji/?vd_source=4aab9da9a92b22ef07aea34a8c52f8de
HW1:
链接:计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
#功能: 计算字符串的长度
def cal_str_len():
str_in = input()
# 考虑字符串非空,长度小于5000
len_str = len(str_in)
if (len_str == 0 and len_str <= 5000):
return ("非法输入")
else:
#分割出最后一个单词
str_splited = str_in.split()
return len(str_splited[-1])
# 打印字符串长度值
print(cal_str_len())
HW2:
"""
描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
数据范围: 1≤n≤1000
输入描述:
第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)
"""
def statistic_times():
# 输入字符串
str_in = input()
# 输入字符
a = input()
count=0
# 字符的空集检查和字符检查
if len(a)==0 and len(a)>1:
return "非字符输入"
else:
# 统一为大写或者小写
for num in str_in.lower():
if num==a.lower():
count += 1
return count
#调用函数输出
print(statistic_times())
HW3:
"""
描述
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围: 1≤n≤1000 ,输入的数字大小满足 1≤val≤500
输入描述:
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。
输出描述:
输出多行,表示输入数据处理后的结果
"""
#输入的第一行:总个数 为整数
N = int(input())
# 检查输入数字的大小
if N>=1 and N<=500:
#定义一个集合,利用集合的非重复性
set_in = set()
for i in range(N):
#输入数据
num = int(input())
#输入数据检测,满足1≤n≤1000
if num>=1 and num<=1000:
set_in.add(num)
else:
print("输入数据不满足1≤n≤1000")
#输入结束后,进行排序,由于集合是没有顺序的,这里转化成列表元素排序
list_num = list(set_in)
list_num.sort() #sort 默认从小到大的升序排列
# 进行逐行输出
for j in list_num:
print(j)
else:
print("n 应该在1到500之间")
HW4:
"""
描述
•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
"""
def str_occupy_8(string):
str8 = string+'0'*(8-len(string))
return str8
# 输入一个字符串
str_in = input()
# 空字符串
if len(str_in) != 0:
if len(str_in) <= 100 and len(str_in) >=8:
# 拆分
while True:
if len(str_in)< 8:
new_str = str_occupy_8(str_in)
print(new_str)
break
elif len(str_in)==8:
print(str_in)
break
else: #拆分
print(str_in[:8])
str_in = str_in[8:]
# 长度小于8, 补0
elif len(str_in)>0 and len(str_in) < 8:
new_str = str_occupy_8(str_in)
print(new_str)
else:
print('str_length>100')
HW5:
'''
描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 1≤n≤2^31-1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
'''
num_in = int(input(),16)
if num_in>=1 and num_in<=2**31-1:
print(num_in, end='\n')
HW6
'''
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
数据范围: 1≤n≤2×10^9+14
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
'''
#思路
'''
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步
'''
import math
def divid_factor(num):
# 定义一个列表来存所有的分解因子
factor_list = []
if num>=1 and num<=2*10**9+14:
temp_num=num
count = 1
while True:
count+=1
if temp_num % count == 0:
# 修改temp_num的值
temp_num = int(temp_num/count)
factor_list.append(count)
if temp_num ==1: # 说明这是最后的一个因子
break
else:
# count 值再分解一次,不用重新从1开始迭代
count-=1
# 这个分支主要是优化程序效率,否则内存和时间用例通不过
elif count >= math.sqrt(temp_num): # 本身是质数(如果是非质数的话至少会有一个分解因子下于它的平方根)
factor_list.append(temp_num)
break
else:
print('Not in the number range')
return factor_list
# main
num = int(input())
factor_nums = divid_factor(num)
for i in factor_nums:
print(i, end=' ')
HW7
'''
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
数据范围:保证输入的数字在 32 位浮点数范围内
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
'''
# 这个方法会有一组用例通不过(如4.5)
'''
num = float(input())
if num>0 and num<2**32:
print(round(num))
'''
# 另一种方法
str_in = input()
str_split = str_in.split('.')
interger_part = int(str_split[0])
fractorial_part_str= str_split[1]
first_fra_num = int(fractorial_part_str[0])
if first_fra_num>=5:
print(interger_part+1)
else:
print(interger_part)
HW8:
'''
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
'''
# 输入键值的个数
key_total_nums = int(input())
dict_v = {}
# 考虑约束条件
if key_total_nums>=1 and key_total_nums<=500:
for i in range(key_total_nums):
index, value = input().split()
index = int(index)
# 如果键存在,返回键值,如果不存在,返回0,加上value 赋值给index对应的值
dict_v[index] = dict_v.get(index,0) + int(value)
else:
print('out of the range')
# 打印输出:
for i in sorted(dict_v):
print(i, dict_v[i])
HW9
'''
描述
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。
数据范围:1≤n≤10^8
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
'''
#输入字符数字
str_in = input()
#约束条件
if int(str_in)>=1 and int(str_in)<=10**8 and int(str_in[-1]) != 0:
str_reverse = str_in[::-1]
str_num = ""
for i in range(len(str_reverse)):
index = str_num.find(str_reverse[i])
if index == -1: # 查找不到的返回值为-1
str_num = str_num + str_reverse[i]
print(int(str_num))
HW10:
'''
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1≤n≤500
输入描述:
输入一行没有空格的字符串。
输出描述:
输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
'''
str_in = input()
str_set = set()
for i in range(len(str_in)):
temp_str = str_in[i]
num_temp = ord(temp_str)
# check ASCLL range [0,127]
if num_temp >= 0 and num_temp <= 127:
str_set.add(num_temp) # 集合有天然去重的性质
# output
print(len(str_set))