2010-08-26 115 views
2

現在開始在學校用Python進行一些編程,我不知道如何處理這個問題。有什麼想法嗎?Python;鏈接列表和遍歷!

輸入由用換行符分隔的整數組成。你的程序應該在鏈表中提交它們,遍歷鏈表並打印最高的數字。

東西拿第一號,並做它說:「如果未來數越大,需要的是一個,否則,保持目前的數量,低着頭列表和重複」

然後,當一個動作它到達列表的末尾,它打印它的值。

from sys import stdin 

class Kubbe: 
    vekt = None 
    neste = None 
    def __init__(self, vekt): 
     self.vekt = vekt 
     self.neste = None 

def spor(kubbe): 
    # WRITE YOUR CODE HERE 
    # Creates linked list 
    forste = None 
    siste = None 
    for linje in stdin: 
     forrige_siste = siste 
     siste = Kubbe(int(linje)) 
     if forste == None: 
      forste = siste 
     else: 
      forrige_siste.neste = siste 

# Calls the solution function and prints the result 
print spor(forste) 

輸入:例如

54 
37 
100 
123 
1 
54 

需要的輸出

123 
+10

哇。我沒有意識到我只知道* english * python。 – sje397 2010-08-26 13:59:16

+2

請修正縮進和使用*英文*變量名稱 – 2010-08-26 13:59:58

+5

@尼克,爲什麼英文名稱是必需的? Python 3甚至會遇到麻煩,允許包含_any_字母Unicode字符的標識符(以及中文,越南文,韓文,阿拉伯文,...)的名稱......) – 2010-08-26 14:26:37

回答

0

在Python內置函數叫做reduce,它遍歷列表和 「壓縮」,它與給定的功能。也就是說,如果你有五行[a,b,c,d,e]和功能f的名單,這將有效地做

temp = f(a,b) 
temp = f(temp, c) 
... 

你應該能夠用它來寫一個非常巧妙的解決辦法。

如果您不想抽象,您需要依次遍歷列表中的每個元素,將迄今爲止最大的數字存儲在變量中。只有當您到達的元素大於所述變量的值時才更改變量。

+0

'reduce(max,sequence)'更適合'max(sequence)'嗎? – 2010-08-26 14:19:31

+0

@亞歷克斯:哦,我以爲他會寫自己的成對「max」。顯然'max(sequence)'是更好的Python。 – katrielalex 2010-08-26 14:28:07

5

「鏈接列表」在Python中很少使用 - 通常只使用list,Python內置列表,實際上它更像是一個「動態矢量」。因此,將特定的鏈接列表作爲練習約束的一部分是特別的。

但主要的一點是,你正在展示的代碼是已經創建鏈接列表 - 頭是forste,並且對於每個節點,所述.neste下一個節點的指針,在.vekt有效載荷。所以,大概這不是你問的問題,不管你的問題的文字。

簡單的方法來遍歷你的鏈接列表,一旦你已經完全構造它(即在爲spor當前代碼結束)是

current = forste 
while current is not None: 
    ...process current.vekt... 
    current = current.neste 

在你的情況,對於「過程中的邏輯「部分是當然的,因爲你的Q的文本已經說:

if current.vekt > themax: 
     themax = current.vekt 

唯一的精妙之處是,你需要在初始設置themax,這while循環之前‘儘可能少’;在最新版本的Python,「負無窮大」可靠地記錄並比較(雖然只是作爲一個浮動,但它仍然正確比較整數),所以

themax = float('-inf') 

會工作。更優雅的可能是最初將最大值設置爲第一個有效載荷,從而避免與無窮大相混淆。

+0

也可能它是有用的斯波爾有返回聲明和forste具有全球價值......當然還有實際使用kubbe或刪除參數。 – 2010-08-26 15:12:53

0

這似乎與您的輸入(工作在Python 2和3)。注意max是如何與Python的鴨子打字一起工作的!

此版本也適用於Python3中的文件。

import sys 
class Kubbe: 
    vekt = None 
    neste = None 
    def __init__(self, vekt): 
     self.vekt = vekt 
     self.neste = None 

def spor(): 
    # WRITE YOUR CODE HERE 
    # Creates linked list 
    forste = None 
    siste = None 
    while True: 
     linje = sys.stdin.readline().rstrip() 
     if not linje: 
      break 

     forrige_siste, siste = siste, Kubbe(int(linje)) 
     if forste is None: 
      forste = siste 
     else: 
      forrige_siste.neste = siste 
    return forste 

def traverse(linkedlist): 
    while linkedlist is not None: 
     yield linkedlist.vekt 
     linkedlist=linkedlist.neste 

# Calls the solution function and prints the result 
linkedlist=spor() 

for item in traverse(linkedlist): 
    print(item) 

# use builtin max: 
print('Maximum is %i' % max(traverse(linkedlist))) 
# if not allowed: 
m = linkedlist.vekt 
for item in traverse(linkedlist.neste): 
     if item > m: m = item 
print(m) 
+0

這很接近,但它似乎只打印出第一個數字,而不考慮數值。你怎麼看? – lidskjalv 2010-08-26 16:05:07

+0

給我123.你運行了嗎? – 2010-08-26 16:08:49

+0

是的,我運行它,它給了我.txt文件中的第一個數字。我改變了數字,不止一次是舒服。 – lidskjalv 2010-08-26 16:14:31

1

下面是基於您自己的代碼和語言的答案。對不起,如果新的變量和函數名稱翻譯不好,因爲我不會說挪威語(Google Language Tools是我的朋友)。

評論:像飛機空中交通管制大多數國際編程論壇的默認語言,如StackOverflow是英語。如果你使用它,你可能會得到更快,更好,更多的答案 - 並且這可能會使問題和相關答案對其他人數最大。只是我的2øre... ;-)

from sys import stdin 

class Kubbe: 
    vekt = None 
    neste = None 
    def __init__(self, vekt): 
     self.vekt = vekt 
     self.neste = None 

def spor(): 
    # WRITE YOUR CODE HERE 
    # Creates linked list 
    forste = None 
    siste = None 
    while True: 
     try: 
      linje = raw_input() 
     except EOFError: 
      break 
     forrige_siste = siste 
     siste = Kubbe(int(linje)) 
     if forste == None: 
      forste = siste 
     else: 
      forrige_siste.neste = siste 
    return forste 

def finne_maksimal(lenketliste): 
    storste = None 
    if lenketliste is not None: 
     storste = lenketliste.vekt 
     gjeldende = lenketliste.neste 
     while gjeldende is not None: 
      if gjeldende.vekt > storste: 
       storste = gjeldende.vekt 
      gjeldende = gjeldende.neste 
    return storste 

lenketliste = spor() 
storste = finne_maksimal(lenketliste) 
if lenketliste is None: 
    print "tom liste" 
else: 
    print "storste er", storste