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的补码为
轻度测试代码
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; } |