【问题标题】:Find missing element in arithmetic progression在算术级数中查找缺失的元素
【发布时间】:2018-09-26 15:46:56
【问题描述】:

我在尝试获取列表 (I) 的正确索引时遇到了麻烦。基本上,该算法对连续数字列表进行排序,例如 1、3、5、7、9、13,并返回缺少的数字(在本例中为 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;
    }

【问题讨论】:

  • 如果您提供的列表正确,则 temp 将为-1,0,-1,1,-1,2。您完全确定您提供的信息正确吗?
  • 您在寻找IndexOf 索引吗?如果列表是 10 并且从 100 开始怎么办。您不使用差异 = list[1] - list[0];
  • @paparazzo 我正在寻找我正在查看的列表中的当前元素的 IndexOf,所以如果列表元素是 1040,1220,1580,我只想要 if如果我至少在第二个元素上,则要执行的语句。
  • @TozuPug 您需要将其编辑到您的问题中,而不是将其添加为评论。

标签: c# list for-loop indexof


【解决方案1】:

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

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

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

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

    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++)
    {
    }

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

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;
    }

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

【讨论】:

  • 是的,这就是我要找的东西,我的一个朋友实际上向我展示了一个解决方案,它也涉及 if (i == 0) continue,它也有效。感谢您的帮助
【解决方案2】:

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

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

那么你的temp值会尝试找到IndexOf的值i - 0,1,2。

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

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

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

【讨论】:

  • 这真的很奇怪,因为只要 i 在列表的范围内,list.IndexOf(list[i]) 总是计算为 i。我认为他从错误的想法开始,试图循环遍历每个整数,直到找到列表中的元素,而不是仅循环遍历列表。
  • 是的,你是对的 - 正如我所说,我无法理解他的想法,我只是在帮助他弄清楚为什么他只得到 -1。我正在删除这部分答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
相关资源
最近更新 更多