我是靠谱客的博主 风趣蜗牛,最近开发中收集的这篇文章主要介绍算法刷题系列(三)蓝桥杯python基础练习4,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

- 十六进制转十进制

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535

  • 解答程序
# 十六进制转十进制
temp_dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 'F':15}
oxstr = input()
weight = 1
tar = 0
for s in oxstr:
tar = tar * 16 + temp_dict[s]
print(tar)
  • 经验教训
    无。

- 十六进制转八进制

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。

  • 解答程序
# 十六进制转十进制
n = int(input())
temp_list =[int(input(), base=16) for i in range(n)]
for i in temp_list:
print("%o" %(i))
  • 经验教训
    **此题非常重要。**最初,我使用的方法是写了两个函数,用于先将十六进制字符串转换为十进制数,再转换为八进制数(代码如下)
# 十六进制转八进制
temp_dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 'F':15}
n = int(input())
def ox2ten(raw_str):
tar = 0
for i in raw_str:
tar = tar * 16 + temp_dict[i]
return tar
def ten2eight(raw_int):
tar_int = ""
while raw_int > 7:
temp = raw_int - raw_int // 8 * 8
tar_int = tar_int * 8 + temp
raw_int = raw_int // 8
else:
tar_int = tar_int * 8 + temp
return tar_int
data_list = [input() for i in range(n)]
tar_list = [ten2eight(ox2ten(i)) for i in data_list]
for i in tar_list:
print(i)

此版本代码首先存在最大的问题是:tar_int * 8这一语句块,事实上,我们是使用十进制数的形式来表示八进制数,因此位数的移动在不用位符号的时候应当选择乘以10。但事实上,每一次的余数temp应当是添加到tar_int的前面的,这一操作极其复杂。考虑到题目中的输入十六进制数可以很大,这里直接选择用字符串来解决,改进后的代码为

def ten2eight(raw_int):
tar_int = ""
while raw_int > 7:
temp = raw_int - raw_int // 8 * 8
tar_int = str(temp) + tar_int
raw_int = raw_int // 8
else:
tar_int = str(raw_int) + tar_int
return tar_int

然而,这种方式执行的代码时间执行长度远远超过1s,这也是python语言最容易遇到的问题。研究后笔者发现,事实上python的int函数可以直接处理进制问题。

int(x, base) x为字符串或者整数,base为进制数

但是当x为整数的时候,进制数参数是被禁用的,也就是说我们无法将十进制数直接扔进去转为八进制数。因此我们还需要用print的格式化输出

print("%o" %()) %o表示无符号格式化八进制

于是代码被修改为

n = int(input())
temp_list =[int(input(), base=16) for i in range(n)]
for i in temp_list:
print("%o" %(i))

简洁明了,运行时间还只需要31ms。

做此类题目可以明白一定要充分发挥python的优势,在执行速度方面无法与C,JAVA比较的前提下要尽可能发挥python提供的方法,熟悉python语言的函数是非常重要的。

- 数列排序

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9

  • 解答程序
n = int(input())
number_list = list(map(int, input().split()))
number_list.sort()
for i in number_list:
print(i, end=" ")
  • 经验教训
    1、sort函数有两个参数,key可以提供方法用于选择排序指标,reverse用于选择降序还是升序(False)排序.
    2、sort函数不提供返回值,本质是list的一个成员方法,内部排序,sorted才提供返回值。
    3、鉴于使用到了sort,lambda匿名函数也需要提及。其本质上为
    lambda x: g(x) 等价于 func(x):g(x)
    4、print函数可以通过end来控制是否换行,以前采用字符串拼接后再输出,这次尝试了不同的方法。

最后

以上就是风趣蜗牛为你收集整理的算法刷题系列(三)蓝桥杯python基础练习4的全部内容,希望文章能够帮你解决算法刷题系列(三)蓝桥杯python基础练习4所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部