iT邦幫忙

1

【HackerRank 解題筆記】尋找亞軍(Find the Runner-Up Score!)

  • 分享至 

  • xImage
  •  

大家好,小弟目前剛自學Python,由於怕自己金魚腦,解完了上一個解到下一個時就忘記了,便想到使用寫文章的方式,一方面記錄自己的思維思考,另一方面後續複習時也比較能回到當時的思考邏輯。

由於文章中會有許多疑問與自我解答,加上小弟是初學者,如有問題建議直接發問會比較快獲得正確解答QQ

當然如果大大們有找到我內容中的錯誤點,希望能夠跟小弟說一下(Orz
(如果有引用,內容會是搜尋到的答案)

目前第一天,卡在HackerRank的Basic Data Types的Finding the percentage問題

題目為提交N分數,將N分數存為list並找到第二名,並且2<=n<=10

以下為初始的程式碼

if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())

首先看到後,我的想法是map是什麼?以及我該怎麼找出亞軍?還有split的用法

map用法: map(function,list)

將「list 的全部內容」完成「對應的 function」
從而得知,原始程式碼是將input().split()這個內容,完成對應的int() function

但之前有學過,int(內容)可以將內容整數化,那為什麼不直接int(input().split())?
於是我便開始嘗試

n = int(input().split())
print((n))

得到的錯誤為

TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'
找尋報錯的原因,其中找到了
使用 int() 函式進行強制型別轉換時,要求引數x必須是字串、位元組物件、數字,不能是其它的型別
可是input不是str的資料型態嗎?為什麼不能int
所以我開始嘗試找到input()與input().spilt()這兩個資料型態

n = input()
print(type(n))

輸入1 2 3 4 5得出了是str

n = input().split()
print(type(n))

輸入1 2 3 4 5得出了是list

所以當使用者(我)input進去的東西,會是str的資料型態,而當分割後,則會形成一個list
list並不在int的型態轉換裡面,所以會報錯!

那map是什麼呢?

他能夠快速的幫助我們將「list 的全部內容」完成「對應的 function」
所以map的用法map(function,list)是指將list的內容完成function
接下來我就開始思考,int不是型態嗎?為什麼在這邊他會是function?
int() 函数用于将一个字符串或数字转换为整型。
原來int是一個資料型態,int()是一個函數!
到這邊,我就懂了初始的原始碼是在幹嘛
原來是在將輸入的n分數整數化!

那,該怎麼找出亞軍呢?
我原本的想法是,list可以更改,並且有max可以找出最大值
那我是不是能將list中的最大值找出來並remove掉,接著在執行一次max,這樣是不是就找到了亞軍?

n = int(input())
arr = map(int, input().split())
arrmax = max(arr)
arr.remove(arrmax)
print(arr)

報錯了AttributeError: 'map' object has no attribute 'remove'
找了一下這個報錯,得到了在python3中,map不會返回列表,而是返回一個迭代器對象
好的..有看沒有懂,於是將迭代器google了一下,得到了以下解答
remove是使用在list上,而map他返回的不是list,而是裡面的map裡面的元素

假設以下程式碼,input進去1 2 3 4 5,則map返回的會是1 2 3 4 5,而不是list

arr = map(int, input().split())

那我該怎麼找出亞軍呢?
我想到了迭代器是否也跟list一樣,有remove的方式可以移除
但是當我google了迭代器移除,我得知了迭代器並不能夠被移除的(但有特殊辦法可以)

到這邊後我就卡住了,因為所學中,目前尚未學習到迭代器的刪減
透過討論區後,發現有使用轉換資料型態完成代碼的的部分,在這邊目前就先使用此方式
等待後續學習到迭代器後,再重返這題並完成該題題目。

討論區中的編碼

if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())
    arr = sorted(list(set(arr)))
    print(arr[-2])

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
andy3278
iT邦新手 5 級 ‧ 2022-11-14 17:40:59

input()會讀取一行資料 然後下一行
python input()和map()的文件
map()會將function獨立地作用於list中每個元素
e.g. map(int, ['1','2','3']) -> [int('1'),int('2'),int('3')]

假設我們input是:
5
2 3 6 6 5
if __name__ == '__main__':
    print(input())
    # return 5
    print(input())
    # return 2 3 6 6 5
    print(input())
    # EOFError: EOF when reading a line 沒有下一行了

下面是我對答案的理解

if __name__ == '__main__':
    n = int(input()) # 讀取 '5' 轉變成 int 5
    # input().split()是['2','3','6','6','5']
    arr = map(int, input().split())#轉變成 mapobject [2,3,6,6,5]
    arr = sorted(list(set(arr))) # set()會把重複的去除 
    #然後由小到大排列 [2,3,5,6]
    print(arr[-2]) # return 由最後起第二個數字 5

我要留言

立即登入留言