关于C#:对从0到size-1的所有整数进行数组检查

Array check for all integers from 0 to size-1

问题是:我的程序得到一个大小为n的数组,其中包含从0到n-1的数字。你可以假设我们没有得到低于0或高于n-1的数字。

我需要检查数组是否包含0到n-1之间的所有数字,如果包含,则返回1。否则为0。

不允许使用其他数组,并且程序必须在O(n)中运行。

示例:

大小为5的数组:4,1,0,3,2返回1。

大小为5的数组:4,1,0,3,1返回0(2不在数组中)

以伺服方式尝试被卡住,任何帮助都会被感激。


假设2的补码为int,数组可以更改。使用符号位标记访问的单元格。

轻度测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int OneOfEach(int *A, int count) {
  int result = 1;
  for (int i = 0; i < count; i++) {
    int cell_to_mark = A[i];
    if (cell_to_mark < 0) {
      cell_to_mark = -1 - cell_to_mark;
    }
    assert(cell_to_mark >= 0 && cell_to_mark < count);
    if (A[cell_to_mark] < 0) {
      // done all ready
      result = 0;
      break;
    }
    A[cell_to_mark] = -1 - A[cell_to_mark];
  }
  // restore.
  for (int i = 0; i < count; i++) {
    if (A[i] < 0) {
      A[i] = -1 - A[i];
    }
  }
  return result;
}


这可以通过类似于值0到n-1的特殊循环排序来完成。时间复杂度为O(n)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* check if a[] has one each of numbers 0 to n-1 */
/* reorder a[] in place according to values in a[] */
/* a[] only has numbers 0 to n-1 */
/* also sorts array in O(n) time */
int chka(int a[], int n)
{
int i, j, k;
    for(i = 0; i < n; i++){
        if(i != a[i]){                  /* if element out of place */
            k = i;                      /*  cycle elements */
            while(i != (j = a[k])){
                if(a[k] == k)           /*  if destination already has */
                    return 0;           /*    value, it's a duplicate */
                a[k] = k;
                k = j;
                if(k < 0 || k >= n)     /*  if out of range */
                    return 0;           /*    return 0 */
            }
            if(a[k] == k)               /*  if destination already has */
                return 0;               /*    value, it's a duplicate */
            a[k] = k;
        }
    }
    return 1;
}


您只需将它所属的每个元素按顺序排列。如果有两个属于同一个地点,那么你有一个副本,这意味着必须有一个丢失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool checkArray(int *array, int count)
{
    int i=0;
    while (i<count)
    {
        int el = array[i];
        if (el < 0 || el >=count)
            return false;
        if (el == i)
        {
           //already in the right place
           ++i;
           continue;
        }
        if (array[el]==el)
            return false; //duplicate
        //swap element into correct position
        array[i]=array[el];
        array[el]=el;
        //loop to reprocess the same position, since we just
        //changed the element there
    }
    return true;
}