在算术级数中找到缺少的术语 -

时间:2014-02-05 01:13:38

标签: java math io

所以我正在网上编写这个编程挑战,我应该编写一个程序,在算术级数中找到缺少的术语。我用两种方式解决了这个问题:一个用于对所有给定的进展项进行求和,然后从实际进展的总和中减去它。我的另一个解决方案是基于找到进展的差异,然后在for循环中使用该差异来找到缺失的术语。当我的第一个解决方案成功通过所有测试用例时,我的第二个解决方案在7个测试用例中失败了。挑战不允许任何人看到他们的测试用例,所以我不知道出了什么问题。任何人都可以想到我的第二个解决方案未能找到算术级数的缺失术语的情况吗?我的第二个解决方案的代码如下。

import java.io.*;
import java.util.Vector;

public class Solution {

    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        String[] numbers = br.readLine().split(" ");
        Vector<Integer> ap = new Vector<Integer>();
        for (String str: numbers){
            ap.add(Integer.parseInt(str));
        }
        int first = ap.get(0);
        int last = ap.get(ap.size()-1);
        int incr = (last-first)/num;
        for(int i = first; i<=last; i+= incr){
            if(!ap.contains(i)){
                System.out.println(i);
                break;
            }
        }
    }

}

输入格式第一行包含一个整数N,它是将作为输入提供的术语数。接下来是N个连续的整数,每对整数之间有一个空格。所有这些都在一行上,并且它们在AP中(除了缺少整数的点之外)。

4 个答案:

答案 0 :(得分:2)

public class MissingAp 
{
public static void main(String args[]){

    int arr[] ={10,8,4,2,0,-2,-4,-6,-8,-10,-12};
    int difference[]=new int[arr.length-1];
    int missingTerm;

    for(int i=1;i<arr.length;i++){
        difference[i-1] = arr[i]-arr[i-1];  
    }
    for(int j =0;j<arr.length-1;j++){

        if(difference[j]!=difference[j+1]){
            missingTerm = arr[j]+difference[j+1];
            System.out.println("The missing term is: " + missingTerm );

        break;

}}}}

此程序将帮助您找到AP的缺失术语。

答案 1 :(得分:1)

如果序列减少而不是增加,这不会失败吗? 如果我有数字10,8,4,2,0,则缺失值为6。 您可以正确找到-10/5 = -2的增量。 但是那么你从i = 10开始的循环,减少2 ...只要i <= 0,那么我立刻就是&gt; 0,所以它在退出之前退出循环。 &LT;只有增加才有效。 所以这是i<=last声明,我认为是问题。

所以你需要根据它是正增量还是负增量来调整i<=last;语句。我认为这将与绝对值和\或Math.signum有关,或者包括基于负增量的单独代码部分(不是最快的方式,但是合理的)。但是我从来没有在Java上做过多少,你问过它是如何失败的。所以希望你的答案是: - )

答案 2 :(得分:0)

对数组进行排序以确保这适用于任何情况。 Arrays.sort(input_array)

答案 3 :(得分:0)

基于JavaScript的解决方案:
这有两种情况:

案例1

  • 传入的数组只有一个缺失的术语,第一个和最后一个 条款不是缺失的。它肯定有一个缺失的术语。
  • 在这种情况下,我们只需要数组并使用基本学校公式
  • n个词的总和= n/2 * (first + last)

    function getMissingTerm(terms, n) {
        var expectedSum = ((terms.length + 1)/2) * (terms[0] + terms[terms.length - 1]),
            actualSum = 0;
    
        for (var i = 0; i < terms.length; ++i) {
            actualSum += parseInt(terms[i], 10);
        }
    
        return expectedSum - actualSum;
    
    }
    

案例2

  • 传递的数组本身没有缺失的术语
  • 意味着缺少的术语是第一个或最后一个术语
  • 在这种情况下,必须传递术语n的长度,该长度大于数组长度

    function getMissingTerm(terms, n) {
        var smallestDifference = Math.abs(terms[1] - terms[0]),
            missingTerm = null;
    
        for (var i = 2, diff; i < terms.length; ++i) {
            diff = Math.abs(terms[i] - terms[i - 1]);
    
            if (diff !== smallestDifference) {
                missingTerm = diff < smallestDifference ? i : i + 1;
            }
        }
    
        return (n && terms.length < n) ? 
            [terms[0] - smallestDifference, terms[n-2] + smallestDifference] : // return possible 2 terms, at the start and end of array
            terms[0] + (missingTerm - 1) * smallestDifference; // return the missing term
    }