如何在不使用列表的情况下找到整数字符串的最大整数?

时间:2016-10-10 02:19:36

标签: python

我必须使用for循环,不允许列表。可以假设字符串是非空的。我有什么:

def max_numbers(s):
    n_string = ''
    for char in s:
        if char.isdigit():
            n_string += char
    return max(n_string)

max_numbers('22  53 123 54 243')
5
expected 243

请不要使用任何先进的方法,我还是初学者。我希望243出现,但最终以5结束。

4 个答案:

答案 0 :(得分:4)

这个想法是从字符串中分离出整数(正如你已经做的那样,但有点错误),并记录到目前为止的最大值。如果某个字符不是数字,则将n_string转换为int并与max_进行比较,以跟踪到目前为止找到的最大值,然后将n_string设置为空号。

最后的检查是针对最后一个数字,因为在字符串的末尾可能并不总是非数字,所以最后一次迭代不会在else部分。

def max_numbers(s):
    n_string = ''
    max_ = 0
    for char in s:
        if char.isdigit():
            n_string += char
        else:
            if n_string and int(n_string) > max_:
                max_ = int(n_string)
            n_string = ''

    if n_string and int(n_string) > max_:
        max_ = int(n_string)

    return max_

print(max_numbers('22  53 123 54 243'))

输出:

243

修改

如果n_string为空,则int(n_string)失败并显示错误

  

ValueError:基数为10的int()的文字无效:' '

因此,为了避免这种情况,需要检查n_string是否为空,才能执行int(n_string)。在python中,empty string evaluates to False, and non-empty string to True。所以,只需写

if n_string and int(n_string) > max_:

检查n_string是非空 n_string,因为整数大于max_。当n_string为空时,if的第二部分由于if的{​​{3}}行为而未评估,因此可以避免错误。

一些相关链接:

答案 1 :(得分:1)

不会为你编写任何代码,因为按照指定的方式进行操作只会很无聊。此外,由于你没有说明你正在使用的python版本,我将假设版本2.

以下是您需要的一些事项:

算法如下:

  1. 首先将名为num的变量初始化为空字符串

  2. 读取数字,直到您到达字符串的末尾或达到非数字。每个数字读取都应附加到num

  3. 如果您到达字符串的空格或末尾并且neg不为空,请使用intnum转换为整数,否则跳至第5步
  4. 将此值与当前最大值进行比较,如果值较大,则将max替换为
  5. 如果尚未到达字符串的末尾,则从步骤1开始重复
  6. 最后打印当前的最大值
  7. 处理负数的特殊情况

    1. 将名为num的变量初始化为空字符串,将名为neg的变量初始化为1
    2. 如果读取的第一件事不是数字且不是空格而是-字符,请将neg设置为-1,否则读取数字,直到您到达字符串的末尾或达到非数字。每个数字读取都应附加到num
    3. 如果您到达字符串的空格或末尾并且num不为空,请使用intnum转换为整数;否则跳到第6步
    4. 将此整数乘以neg
    5. 将此值与当前最大值进行比较,如果值较大,则将max替换为
    6. 如果尚未到达字符串的末尾,则从步骤1开始重复
    7. 最后打印当前的最大值
    8. 非无聊的版本:

      print (max(map(int, my_str.split())))
      

答案 2 :(得分:1)

def max_numbers(s):
    # biggest number we've seen so far.  init to a very small number so
    # it will get replaced immediately by real input data
    biggest = -999

    # accumulate digit characters from input
    n_string = ''

    # loop through each input character
    for char in s:

        # is it a digit 0-9?
        if char.isdigit():

            # add it onto the end of n_string
            n_string += char

        # not a digit
        else:

           # if n_string has some digits in it
           if n_string:

                # calculate integer value of n_string, and if it's bigger
                # than the previous biggest, save it as the new biggest
                biggest = max(biggest, int(n_string))

                # reset n_string back to empty
                n_string = ''

    return biggest

答案 3 :(得分:-2)

如果@ IvanCai的答案太高级,请尝试:

def max_numbers(s):
    top=0
    curr=0
    for char in s:
        if char.isdigit():
            curr*=10
            curr+=int(char)
            if curr>top:
                top=curr
        elif char==' ' or char=='\n':
            curr=0
    return top
print(max_numbers('22 53 123 54 243'))