2010-08-26 90 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