华为机试/笔试联系题Python3-刷题答案笔记(身边按照这个刷了一遍的都拿到了HW offer, 可以用作很好的练习材料)

华为机试/笔试联系题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))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值