检查数组元素是否连续无序

Use*_*003 0 .net c#

我有以下代码:

int[] arr = { 1, 2, 3, 4 };
int n = arr.Length;
bool result = areConsecutives(arr, n);
if (result == true)
    MessageBox.Show("Yes");
else
    MessageBox.Show("No"); 

static bool areConsecutives(int[] arr, int n)
{
    int first_term = int.MaxValue;

    for (int j = 0; j < n; j++)
    {
        if (arr[j] < first_term)
            first_term = arr[j];
    }

    int ap_sum = (n * (2 * first_term + (n - 1) * 1)) / 2;

    int arr_sum = 0;
    for (int i = 0; i < n; i++)
        arr_sum += arr[i];

    return ap_sum == arr_sum;
} 
Run Code Online (Sandbox Code Playgroud)

即使我将数组更改为:

int[] arr = { 4, 2, 1, 3 }
Run Code Online (Sandbox Code Playgroud)

问题/问题是我可以做些什么来检查数组元素是否连续,例如,如果我有以下数组:

int[] arr = { 4, 8, 12, 16 }
Run Code Online (Sandbox Code Playgroud)

它们是连续的/乘以 4 并且数组也可以是这样的:

int[] arr = { 16, 4, 8, 12 }
Run Code Online (Sandbox Code Playgroud)

can*_*on7 5

这是一种方法:

var vals = new[] { 125, 25, 50, 75, 100 };
Array.Sort(vals);
bool arithmetic = vals.Zip(vals.Skip(1), (x, y) => y - x).Distinct().Count() == 1;
Run Code Online (Sandbox Code Playgroud)

我们首先对数组进行排序。然后我们取每对元素(取 25 和 50,然后取 50 和 75 等)并找出它们之间的差异。然后我们取我们发现的不同差异的数量,看看它是否为 1:如果是,我们的元素是均匀分布的。


这是另一个:

var vals = new[] { 125, 50, 75, 100 };
Array.Sort(vals);
bool areArithmetic = true;
if (vals.Length > 1)
{
    int difference = vals[1] - vals[0]; 
    for (int i = 2; i < vals.Length; i++)
    {
        if (vals[i] != vals[0] + i * difference)
        {
            areArithmetic = false;
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们再次对列表进行排序,然后循环遍历排序后的列表。我们找到前两个元素之间的差异,然后检查每个后续元素是否是该差异的适当倍数。