【问题标题】:Finding maximum alternating sum of digits (python 3)查找最大交替数字总和(python 3)
【发布时间】:2014-03-14 13:53:37
【问题描述】:

我被要求编写一个函数,它可以找到给定数字和给定位数中的最大交替数字总和。例如,数字 81010 有 3 个长度为 3 - (8-1+0),(1-0+1),(0-1+0) 的交替和,我们应该返回答案 7。

对每个数字子序列求和很容易,但可能需要一段时间,并且算法应该足够快以处理非常大的数字。我不知道如何编写这样的函数,其运行速度比普通函数快...

我有一条线索,它说考虑如何通过给定前 n 位数字的总和,我们可以有效地找到序列中从第二位数字开始的数字总和。

请帮忙,谢谢。

PS 我确实看到了一些关于找到最大和的问题,但无法实现找到最大交替和的答案。

这是查找最大连续数字和的代码:

def max_sum(n,d):
    number = list(map(int,str(n)))
    maximum = current = sum(number[:d])
    for i in range(0, len(number)-d):
        current = current - number[i] + number[i+d]
        if current > maximum: 
           maximum = current
    return maximum

【问题讨论】:

  • 发布您的代码,以便我们查看您是否效率低下。不要说“这是我的问题,请给我写快代码”
  • 除了Cyber​​说的,关于“优化”的问题真的应该发到codereview.stackexchange.com

标签: python python-3.x


【解决方案1】:
1. Negate every even number (81010 -> 8 -1 0 -1 0), find biggest_sum_1 starting at an odd position
2. Negate every odd number (81010 -> -8 1 0 1 0), find biggest_sum_2 starting at an even position
3. Return max(biggest_sum_1, biggest_sum_2)

您要求提供算法,因此应将其迁移到 Theoretical Computer Science 网站。

编辑:添加 python 代码

def max_alt_sum(n,d):
  number = list(map(int,str(n)))
  negatedEven = []
  negatedOdd = []
  for i,v in enumerate(number):
    if i%2==0:
      negatedOdd.append(v)
      negatedEven.append(-v)
    else:
      negatedOdd.append(-v)
      negatedEven.append(v)
  maximum = sum(negatedEven[:d])
  for i in range(0, len(str(n))-d+1):
    if i%2==0:
      current = sum(negatedOdd[i:i+d])
    else:
      current = sum(negatedEven[i:i+d])
    if current > maximum:
      maximum = current
  return maximum

【讨论】:

  • 我设法做到了,但我知道我面临另一个问题。序列中的第一个数字必须是正数,我不知道如何使它...
  • 我还是不知道怎么弄...你能用代码发布答案吗?
  • 不幸的是,我再次检查了代码,但它运行得不太好。例如,对于 n=43805 和 d=3,我们应该返回 13,但它返回 9。如何解决?
  • 哦,对不起,range 函数不包含,所以需要+1
  • 谢谢,我只在n为字符串(n="81010")时测试过,所以我编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多