查找等差级数中缺失的元素
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。
澄清一下你的问题和代码。
我在尝试获取 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。
澄清一下你的问题和代码。