Re: [問題] 新手list問題請教

作者: handsomeLin (DoGLin)   2018-09-26 13:38:09
※ 引述《chinsun ()》之銘言:
: 大家好,我目前在國外求學,算是程式新手
: 班上一個人都不認識,助教的口音也幾乎聽不懂QQ
: 只好拿作業上來問
: 題目是要寫一個increment的方法,輸入和輸出的型態都要是list
: 例子:
: z=[0,9,9,9]
: z.increment()
: 我目前寫的:
: def increment(self):
: zadd=self.amount
: a=zadd
: while '9' in a:
: a.remove('9')
: if a==[]:
: zadd=['0',zadd] #如果陣列裡全是9,在最前面加0
: i=len(zadd)
: while i!=0:
: if zadd[i-1]=='9' :
: zadd[i-1]='0' #一項一項將9轉為0
: i-=1
: else:
: zadd[i-1]+=1 #非9的話加1
: return zadd
: 將9轉為0那邊沒有問題
: 但當陣列全為9,在最前面加入0那邊
: 不知道為什麼zadd其中的9也跟著a被remove掉
: 舉個例子,如果輸入['0','9','9','9'],a會變成['0'],但zadd也會一起變成['0']
: 但我以為zadd應該還是原本的樣子
: 第二個問題是else裡+1那邊,請問要怎麼做才能讓list中的東西進行運算呢
: 我試過將他轉成string,但還是顯示must str not int
: 感謝
先回答你第一個問題,你a = zadd的時候只是把zadd的記憶體位置傳給a而已
這點你可以用id()去看,他們指向的是同一個物件
你直接對這個物件操作(remove) 自然就刪掉zadd 或是你self.count都一樣被改變了
你真的想要去算有幾個9 又不考慮time complexity直接用count就行了
zadd.count('9) == len(zadd)
這題解法 可以利用上一題直接join轉成字串再轉成數字+1
python數字的上限取局於記憶體 所以基本上不用擔心overflow的問題
但是顯然不是最佳解 比如說list長度是個一萬 還是有機會overflow
下面寫一段假設裡面是數字
for i in range(len(z) - 1, -1, -1):
z[i] = (z[i] + 1) % 10
if z[i]:
break
if z and not z[0]:
z.insert(0, 0)
(如果是字串 就用int先轉成數字 然後再轉回str就行了
if z[i] 改成 if z[i] != '0')
從最後一位開始加1 如果不是0代表不用進位break直接結束loop
如果全部都是0 就代表要新增一位(照你的敘述是擺0)
我上面這段是直接對z操作
p.s zadd = [0, zadd] 這樣會是[int , list]的形式
作者: s077022 (和電腦對看中(男))   2018-09-27 10:18:00
http://i.imgur.com/0P60ZHT.jpg你們教授這題考的是將list型態轉int型態後 ,經過計算後,再將int轉list型態如果沒有要強制前面加新的元素 ,下圖是答案http://i.imgur.com/TpWoJuN.jpg
作者: handsomeLin (DoGLin)   2018-09-27 23:29:00
這位大大你的code reverse了東西兩次呢還有你的字串長度hard code了...
作者: s077022 (和電腦對看中(男))   2018-09-28 08:40:00
謝謝樓上指教 ,因為我不是專業的coder ,純興趣 ,不過您的建議我會聽進去 ,謝謝您的即時回饋 , 謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com