【问题标题】:make sure array is sequential in C#确保数组在 C# 中是连续的
【发布时间】:2011-07-21 18:14:55
【问题描述】:

我有一个整数数组,我们从第三方提供商那里获得。这些是连续的,但由于某种原因它们错过了一个数字(抛出异常,它被吃掉并且循环继续丢失该索引)。这导致我们的系统有些麻烦,我试图确保我们得到的数组确实是连续的。

数字从不同的偏移量开始(有时是 1000,有时是 5820,其他是 0),但无论从哪里开始,它都意味着从那里开始。

验证数组是否连续的最快方法是什么?尽管它现在看起来是一个必需的步骤,但我也必须确保它不会花费太长时间来验证。我目前从第一个索引开始,拿起数字并添加一个并确保下一个索引包含该等。

编辑: 系统失败的原因是人们使用系统的方式,它可能并不总是按照最初选择的方式返回代币——说来话长。不幸的是,数据在到达我们的层之前无法更正。

【问题讨论】:

  • 如果你总是得到一个顺序数组 - 为什么他们不只传递一个数字让你在你身边生成数组?
  • 你需要它是连续的还是连续的?
  • 是否可以只获取起始值和结束值(或元素数)并自己创建数组? Enumerable.Range(start, count)

标签: c# arrays algorithm data-structures sequences


【解决方案1】:

如果您确定数组已排序且没有重复,您可以检查:

array[array.Length - 1] == array[0] + array.Length - 1

【讨论】:

  • +1 这很聪明。只需检查最后一个数字是否等于起始数字加上数组长度。不需要任何循环及其 O(1) 复杂度。
  • @JK:但它很大程度上取决于生成端的错误类型。如果发生了什么事情,中间的一个数字出现了两次怎么办?我们仍然会通过此检查,但顺序是错误的。
  • @zerkms:你完全正确。这就是为什么我确保只有在保证数组已排序且没有重复的情况下才有效。
  • 嗨,这很整洁!我们不保证没有重复或丢失的位...
【解决方案2】:
for (int i = a.Length - 2; 0 <= i; --i)
{
    if (a[i] >= a[i+1]) return false; // not in sequence
}
return true; // in sequence

【讨论】:

  • 会不会是这样:for (int i = 1; i
  • 我正在向后迭代,所以 a.Length 只计算一次!
  • 哦,我明白了! if 语句应该是: if (a[i] != a[i+1]+1) return false;
【解决方案3】:

如果对数组进行排序,Gabe 的方式绝对是最快的。如果数组没有排序,那么最好对数组进行排序(使用合并/shell排序(或类似速度的东西)),然后使用Gabe的方式。

【讨论】:

    【解决方案4】:

    我认为在这里解决更大的问题是值得的: 如果数据不符合您的要求(顺序,无间隙),您将怎么做?

    如果您仍要处理数据,那么您可能应该花时间让您的系统更灵活地应对数据中的空白或缺失条目。

    **如果您需要处理数据并且数据必须是干净的,您应该与供应商合作,确保他们向您发送格式正确的数据。

    如果您要跳过处理并报告错误,那么断言没有间隙的前提条件可能是可行的方法。在 C# 中,您可以做许多不同的事情:

    1. 如果数据已排序且没有重复,只需检查LastValue == FirstValue + ArraySize - 1
    2. 如果数据没有排序但没有重复,只需排序并执行上述操作。
    3. 如果数据没有排序,有重复,并且您确实想检测间隙,我会使用 LINQ。

    List&lt;int&gt; gaps = Enumerable.Range(array.Min(), array.Length).Except(array).ToList();

    或更好(因为高端值可能超出范围):

    int minVal = array.Min();
    int maxVal = array.Max();
    List<int> gaps = Enumerable.Range(minVal, maxVal-minVal+1).Except(array).ToList();
    

    顺便说一句,传递一个密集的、无间隙的整数数组的整个概念对于两方之间的接口来说有点奇怪,除非有一些额外的数据与它们相关联。如果没有其他数据,为什么不直接发送一个范围 {min,max} 呢?

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 2020-01-18
      • 2019-09-30
      • 1970-01-01
      • 2012-04-02
      • 2017-10-01
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多