查找等差级数中缺失的元素

Find missing element in arithmetic progression

我在尝试获取 list(I) 的正确索引时遇到了问题。基本上,该算法对连续数字列表进行排序,例如 1、3、5、7、9、13 和 returns,其中缺少数字(在本例中为 11)。我的问题是温度保持在 -1,知道为什么吗?根据我的理解,温度应该随着我的增加而增加

    public static int FindMissing(List<int> list)
    {
        int difference;
        int missing = 0;

        for (int i = 0; i < list.Count; i++)
        {
            difference = list[1] - list[0];
            int temp = list.IndexOf(i);
            if (temp > 0)
            {
                if (list[i] - list[i - 1] != difference)
                {
                    missing = list[i - 1] + difference;
                }
            }
        }

        return missing;
    }

Alexandru Popa 给了我一个很好的答案,但对于未来查看此线程的人,有人向我展示了 continue 关键字,它最终像这样工作

    public static int FindMissing(List<int> list)
    {
        int difference;
        int missing = 0;

        for (int i = 0; i < list.Count; i++)
        {
            if (i == 0) continue;

            difference = list[1] - list[0];
            if (list[i] - list[i - 1] != difference)
            {
                missing = list[i - 1] + difference;
            }
        }
        return missing;
    }

我们需要对您的代码进行一些更改。

首先,让我们检查列表是否包含至少两个元素,否则我们不应该运行算法。

if(list.Count <= 2)
     return 0;

其次,将difference的声明和初始化移出循环。由于 difference 是常数,因此您不应在每次迭代时都计算它。

    if(list.Count <= 2)
       return 0;

    int difference = list[1] - list[0];

第三,让我们从索引 2 开始循环,因为不需要检查 difference 是否等于 difference

    if(list.Count <= 2)
       return 0;

    int difference = list[1] - list[0];

    for (int i = 2; i < list.Count; i++)
    {
    }

第四,不需要检查你的列表是否包含它的索引,那是你代码的粗略部分,你只需要看看每个邻居之间的差异。当其中一个与您的初始差异不匹配时,您就会得到丢失的号码。我们应该立即return,否则如果您的列表中还有其他缺失元素,它可能会被覆盖。

public static int FindMissing(List<int> list)
    {
        if(list.Count <= 2)
           return 0;

        int difference = list[1] - list[0];

        for (int i = 2; i < list.Count; i++)
        {
            if (list[i] - list[i - 1] != difference)
            {
                return list[i - 1] + difference;
            }
        }

        return 0;
    }

但是这个算法不检查列表的完整性。它只会找到列表中第一个缺失的元素。它没有告诉我们列表是否包含其他缺失元素。

根据您问题中的评论 - 您说您的列表包含以下元素:1040,1220,1580。

现在在 for 循环中,您的索引 (i) 将具有值 0,1,2。

然后您的 temp 值将尝试找到 IndexOf i - 0,1,2.

的值

但是在你的列表中,没有这样的值。您的值为 1040,1220,1580。所以 IndexOf 总是 return -1.

这就是为什么你总是看到-1。

澄清一下你的问题和代码。