我刚尝试了一个小小的在线编程测验,要求我尽快解决这个问题。我得到了正确的答案,但我知道它不漂亮。我正在努力成为一名更好的程序员并编写更清晰,更高效的代码,所以请给我一些提示。我已经包括下面的描述。 PS我认为这个算法在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中(除了缺少整数的点之外)。
输出格式 一个数字是该系列中缺失的整数。
示例输入 五 1 3 5 9 11
示例输出 7
答案 0 :(得分:4)
我认为这段代码可以稍微简化一下。一,输入。差别不大,除了我在{3}中使用raw_input
(或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
现在有趣的部分:注意(假设列表格式正确)数字之间可能只有两个差异:正确的差异,或两倍的差异。我使用列表推导来创建元组列表(差异,索引)。现在我可以简单地使用内置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)
答案 1 :(得分:1)
适用于
1)N的任何值(在示例中给出5)
2)术语之间的任何差异(在示例中给出2)
3)差异可以是+以及 - (例如:11 5 2 -1 -4)
int diff[]= new int[length-1];
for(int i = 0; i<length-1;i++){
diff[i] = n1[i+1]-n1[i];
//System.out.println(diff[i]);
if(i!=0){
if(diff[i]<diff[i-1]){
if(diff[i]<0)
System.out.println(n1[i]+diff[i-1]);
else
System.out.println(n1[i-1]+diff[i]);
break;
}
if(diff[i]>diff[i-1]){
if(diff[i]<0)
System.out.println(n1[i-1]+diff[i]);
else
System.out.println(n1[i]+diff[i-1]);
break;
}
}
}
n1是从String存储数字数组的地方。
长度是您提供的数字。
这是优化的,如果你错过前两个数字之间的数字,那么无论你给出了多少数字,它只会循环3次
答案 2 :(得分:0)
非常简单,请查看下面的代码,如果删除了空白行,它将正好是8行 我希望这个答案对你来说很清楚
import re
N = int(raw_input()) #Number of Terms
I = raw_input() #The Series of Numbers received as a String
I = re.findall(r'\d+',I) #Extract items from the string
I = [int(s) for s in I] #I is a list with Series of Integers
for x in range(N-1):
if (I[x]+2 != I[x+1]):
print I[x]+2
答案 3 :(得分:0)
int a[]={1,3,5,7,11};
int i=0,n=5,fd,sd;
printf("output:\n");
do
{
fd=0;sd=0;
fd=a[i+1]-a[i];
sd=a[i+2]-a[i+1];
if(fd<sd)
{
printf("missing term is %d",fd+a[i+1]);
}
else if(fd>sd){
printf("missing term is %d",a[i]+sd);}
else{
i++;}
}while((fd==sd)&&i<n-2);
答案 4 :(得分:0)
N = input()
max_num = range(N)
s = raw_input()
AP = map(int,s.split())
comm_dif = AP[1]-AP[0]
length = len(AP)
for i in range(N):
if i != length-1:
if AP[i+1]-AP[i] != comm_dif:
print AP[i]+comm_dif
INPUT:
5
1 21 31 51 61
输出:
41
答案 5 :(得分:0)
这是我的代码,兼顾正面差异和负面差异......
def find_arith(aplist):
idiff=[]
flag=0
for j in range(0, len(aplist)-1):
diff1 = aplist[j+1] - aplist[j]
if diff1 < 0:
flag=1
idiff.append(abs(diff1))
if flag==1:
final_diff=-1*min(idiff)
else:
final_diff=min(idiff)
print(idiff)
print("final diff:", final_diff)
for i in range(aplist[0],aplist[len(aplist)-1]+1,final_diff):
if i not in aplist:
print(i)
if __name__ == "__main__":
print("First Result")
find_arith([13,21,25,33,37,45])
print("Second Result")
find_arith([-10,-6,-4,-2])
print("3rd Result")
find_arith([-5, -1, 3, 11])
print("4th Result")
find_arith([1, 5, 13, 17, 21])
print("5th Result")
find_arith([-2, -8, -11, -14, -17, -20, -23, -29])
答案 6 :(得分:-1)
2对于像这样的简单问题的循环!!以上解决方案的行为是二次方!!
这是一个解决方案,对于最坏情况行为的O(N),其中项目索引1缺失,并且对于索引1之后缺少的任何项目,解决方案优于线性。
此方法的算术级数(输入数组),用适当的返回替换SYSOUT。
解决方案:
public static int findMissingNumberInAP(int[] ipArr)
{
// ipArr will always be more than 3 elements in size.
int maxDiff = ipArr[1] - ipArr[0];
int i=0;
while(i<ipArr.length-1)
{
if((ipArr[i+1] - ipArr[i]) > maxDiff)
break;
i++;
}
// This means the 2nd element or i=1 was missing so add ip[0] to
// any random difference you are good to go.
if(i == ipArr.length - 1)
System.out.println(ipArr[0] + (ipArr[ipArr.length-1]-ipArr[ipArr.length-2]));
else System.out.println(ipArr[i] + maxDiff);
// Else just add the maxDiff you got from first step to the position
// of i you broke the loop at.
return -1;
}