【问题标题】:Functional way to check if array of numbers is sequential检查数字数组是否连续的功能方法
【发布时间】:2013-08-14 06:50:31
【问题描述】:

假设当每个成功的元素都具有前一个元素+ 1 的值时,数组是连续的。假设我有一个数字数组,如{5,6,7,8}(顺序)或{1,2,5}(非顺序)。

有没有一种很好的函数式方法来检查数组是否是顺序的?我可以使用以下代码:

bool IsSequential(int[] array)
{
    for (int i = 1; i < array.Length; i++)
       if (array[i] != array[i - 1] + 1)
            return false;
    return true;
}

我正在尝试确定一手牌是否是顺子。

【问题讨论】:

  • 王牌你是怎么处理的?如果其值为 1,则不能使用此方法检测 A 高顺子。
  • 你的代码很简单,工作完美
  • 只需使用您已有的代码 - 没关系。
  • 空数组是否可以认为是连续的?

标签: c# .net c#-3.0


【解决方案1】:

试试这个:

    bool IsSequential(int[] array)
    {
        return array.Zip(array.Skip(1), (a, b) => (a + 1) == b).All(x => x);
    }

【讨论】:

  • @AlexeiLevenkov:如果你不使用Skip,你只是在比较元素本身,当然这总是相等的。
  • 只是补充一下,如果 int 数组不按顺序排列,这将不起作用。例如这适用于[4,5,6],但不适用于[5,4,6]。您可以使用array.OrderBy(a =&gt; a).Zip(array.Skip(1), (a, b) =&gt; (a + 1) == b).All(x =&gt; x); 让后者工作。
  • 为此也适用于递减顺序数组,请使用return array.Zip(array.Skip(1), (a, b) =&gt; (a + 1) == b).All(x =&gt; x) || array.Zip(array.Skip(1), (a, b) =&gt; (a - 1) == b).All(x =&gt; x);
【解决方案2】:

我不知道这是否真的是一种改进/更好,但你可以使用 Range。

ENumerable.Range(0, myArray.Length).Any(i => myArray[i] != myArray[0] + i)

如果数组不包含序号,则返回 true。

【讨论】:

  • 很好,虽然如果我们想检查一个数组是否连续的:Enumerable.Range(0, myArray.Length).All(i =&gt; myArray[i] == myArray[0] + i)
【解决方案3】:

使用 Linq:

    public static bool IsSequential(int[] a)
    {
        return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]);
    }

【讨论】:

    【解决方案4】:

    对于所有顺序的、非顺序的数据,这应该可以解决问题。带有样本输入的完整示例。 经过测试,工作正常

    var list = new List<int>(new[] { 7, 6, 5, 4, 3,9});
    int minValue = list.Min();
    int maxValue = list.Count;
    List<int> test =  Enumerable.Range(minValue, maxValue).ToList();
    var result = Enumerable.Range(minValue, maxValue).Except(list);
    if (result.ToList().Count == 0)
    {
      Console.WriteLine("numbers are in sequence");
    }
    else
    {               
       Console.WriteLine("Numbers are not in sequence");
     }
    

    【讨论】:

      【解决方案5】:
      var result = Enumerable.Range(array[0], array[array.Length-1]).Except(array.ToList());
      

      【讨论】:

        【解决方案6】:

        同:make sure array is sequential in C#

        在那里回答:

        如果您确定数组已排序且没有重复项,您只需检查:

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

        【讨论】:

        • 错了,除了第一个和最后一个元素,你对其他元素一无所知。
        • @Serge 这就是指定的原因:如果您确定数组已排序并且没有重复项。如果是这样 - 答案是正确的。想想为什么!
        【解决方案7】:

        首先对数组进行排序,使用 distinct() 删除一种类型的 N(例如对),如果数组长度始终 == 到 5 你需要做的就是 if((array[4] - array[0] ) == 4) 返回真。

        如果是德州扑克,或者您需要同时考虑高牌和低牌顺子,情况就会变得更加复杂。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-20
          • 2019-10-31
          • 2013-08-02
          • 1970-01-01
          • 2011-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多