Algorithm 从给定的算术级数中查找缺少的数字

Algorithm 从给定的算术级数中查找缺少的数字,algorithm,Algorithm,我遇到了这样一个问题,即给你一个数字N作为输入,然后跟着N个数字(其中3当数字按降序排列时,方法1不起作用) 对于75,1的输出应该是3,但算法将给出9 方法2在这种情况下起作用,因为差值被正确地计算为负数,算法也会相应地进行。虽然不是原始问题的答案,但如果您需要它,可以找到一个具有O(logN)复杂度的更好的解决方案来查找缺失的数字(如果只有一个)。使用二进制搜索 对二进制搜索进行以下比较 if(a[mid] != mid*(difference)+a[0]) { mis

我遇到了这样一个问题,即给你一个数字
N
作为输入,然后跟着N个数字(其中3当数字按降序排列时,方法1不起作用)

对于75,1的输出应该是3,但算法将给出9


方法2在这种情况下起作用,因为差值被正确地计算为负数,算法也会相应地进行。

虽然不是原始问题的答案,但如果您需要它,可以找到一个具有O(logN)复杂度的更好的解决方案来查找缺失的数字(如果只有一个)。使用二进制搜索

对二进制搜索进行以下比较

  if(a[mid] != mid*(difference)+a[0]) {

        missing_num = mid*(difference) + a[0];
        search lower half
  }

  else search higher half
为…工作

1) N的任意值(示例中给出5)

2) 术语之间的任何差异(示例中给出2)

3) 差异可以是+也可以是-(示例:11 5 2-1-4)

int diff[]=新的int[length-1];

对于(int i=0;i这是我的Ruby解决方案:

number_of_terms = gets.chomp.to_i
从STDIN获取术语数

progression = gets.chomp.split(' ').map(&:to_i)
获取字符串,删除任何前导和尾随空格,在数字之间的空格处拆分,然后将每个项转换为整数

expected_sum = (number_of_terms+1)/2.0*(progression.first+progression.last)
使用算术级数求和的公式:n/2(a[0]+a[n])

这里除以2.0很重要。需要保持精度

actual_sum = progression.inject(:+)
检查给定数字的总和

missing_element = (expected_sum - actual_sum).to_i
差异当然是缺少的元素。还将转换为整数以删除尾部。0

i、 e.4.0=>4

puts "Missing element is: #{missing_element}"
#包括
#包括
#包括
int findDelta(长*x,int n);
int main(){
int n;
fscanf(标准输入、%d、&n);
long*x=(long*)calloc(n,sizeof(long));
长k;

对于(int i=0;iSeems是的精确副本(或至少与高度相关)。为什么使用此条件:如果(2*array[i]不等于(array[i]+array[i+1]))如果数组是11019,那么它将不起作用。@tobias_k..是的..我想我们去了同一个站点..但是我想我有一个不同的问题…@Wasafa1…哦,对不起,这是一个打字错误…最小值N=3。编辑你确定这是你提交的确切方法吗?在你的方法I中,第二种情况只能在seco进程中的nd元素缺失(否则,缺失的数字可能已经为
i-1
)找到了。如果您在这种情况下有输入错误,它将解释在特定情况下失败的原因。我没有理解您,根据OP方法1失败。diff=(1-7)/3=-2。cicle的第一次迭代将是5==7+(-2),是真的,第二次失败。OP将第一个调用为方法2:)对不起,请理解作者按降序枚举方法。基本点是找到进程的增量。它要么是第一个增量,要么不是。你知道你的代码需要O(n)运行时。?@Varun是的,必须找到log(n)算法。这只是为了完成任务。
expected_sum = (number_of_terms+1)/2.0*(progression.first+progression.last)
actual_sum = progression.inject(:+)
missing_element = (expected_sum - actual_sum).to_i
puts "Missing element is: #{missing_element}"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int findDelta(long *x, int n);

int main(){
    int n;
        fscanf(stdin,"%d",&n); 
        long *x= (long*) calloc(n,sizeof(long));
    long k;
    for(int i=0;i<n;i++){
        scanf("%ld",&k);
        x[i]=k;
    }

    int delta=findDelta(x,n);
    for(int i=0;i<n-1;i++){
        if (x[i+1]-x[i] != delta)
            printf("%ld\n",x[i]+delta);
    }
    free(x);    
    return 0;
}

int findDelta(long *x, int n){
    long delta1,delta2;
    delta1=x[1]-x[0];
    int d1Count=0;
    int d2Count=0;

    for(int i=1;i<n-1;i++){
        delta2=x[i+1]-x[i];
        if(delta2==delta1)
          d1Count++;
        else
          d2Count++;
    }
    if (d1Count > d2Count)
        return (delta1);
    else
        return (delta2);
}