我只是尝试了一个在线编程小测验,让我尽快解决这个问题。我得到了正确的答案,但我知道它并不漂亮。我正在努力成为一个更好的程序员,写更干净,更有效的代码,所以请给我一些提示。我已经包括了下面的描述。我认为这个算法在n=3的情况下失败了
# Enter your code here. Read input from STDIN. Print output to STDOUT
import sys
N= int(sys.stdin.readline())
stringdata = sys.stdin.readline()
array = stringdata.split(' ')
diff1=[0]*(N-1)
diff2 = [0]*(N-2)
index = 0
diff = 0
for i in range(0,len(array)-1):
first_diff[i] = int(array[i+1])-int(array[i])
for i in range(0,len(diff1)-1):
second_diff[i] = first_diff[i+1]-first_diff[i]
if second_diff[i] == 0:
diff = first_diff[i]
else:
index = i
print(int(array[index])+diff)
任务:找出算术级数中缺少的项。
算术级数被定义为一个给定数列的连续项之间存在常数差的级数为您提供算术级数的连续元素然而,有一个问题:在给你的一组数字中,原来系列中的一个词正好丢失了。给定序列的其余部分与原始ap相同。找到丢失的术语。
输入格式
第一行包含一个整数n,这是将作为输入提供的项数。
接下来是N个连续的整数,每对整数之间有一个空格所有这些都在一条线上,并且在AP中(除了缺少整数的点)。
输出格式
序列中缺少的整数。
样本输入
5个
1 3 5 9 11
样本输出
七
最佳答案
我认为这段代码可以简化一些。首先,输入没有太大的不同,除了我使用raw_input
(或者在python 3中使用input
),我立即map
到int
的数字。
n = int(raw_input("Number of Numbers: "))
s = raw_input("List of Numbers, space-separated: ")
nums = map(int, s.split())
assert n == len(nums) and n > 2
有趣的是:注意(假设列表格式正确)数字之间可能有两个差异:要么是正确的差异,要么是两倍的差异。我使用列表理解来创建元组列表(difference,at index)。现在,我可以简单地使用内置的
max
函数来查找两倍于正确差分的函数和相应的索引(d2, index
),并计算缺失的数字。diffs = [(nums[i+1] - nums[i], i) for i in range(n-1)]
(d2, index) = max(diffs)
print nums[index] + d2 / 2
但问题是编码风格,而不是算法,所以我的想法是:
在程序的逻辑块之间添加一些空行和注释(例如
# read input
)map
将数组设置为int
一次,而不是每次需要时都对其进行转换您可以使用列表理解来创建
diff1
(又名first_diff
),如我的示例所示你根本不需要
diff2
;只要写if diff1[i+1] - diff1[i] == 0:
简洁:
range(0,len(array)-1)
与range(N-1)
相同