1. 程式人生 > 其它 >演算法刷題系列(三)藍橋杯python基礎練習4

演算法刷題系列(三)藍橋杯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來控制是否換行,以前採用字串拼接後再輸出,這次嘗試了不同的方法。