以下是我需要回答的问题: 我的程序得到一个大小为n的数组,其中包含从0到n-1的数字。您可以假设我们没有得到低于0的数字或高于n-1的数字。
我需要检查数组是否包含0到n-1之间的所有数字,如果包含,则返回1。否则为0。
的示例:
大小为5的数组:4,1,0,3,2
返回1。
大小为5的数组:4,1,0,3,1
返回0(2不在数组中)
我试图做的事情:
int Ex4_bonus() //sort a using a single for loop, then iterate through it with another for loop to look
{ // for a spot that doesnt equal the value inside it.
int i,n,boolean=1,temp=0;
int* a;
printf("Enter the size of the array\n");
scanf("%d",&n);
a=input_array_dyn(a,n);
printf("Enter numbers from 0-%d\n",n-1);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(a[i]!=i)
{
temp=a[a[i]];
a[a[i]]=a[i];
a[i]=temp;
}
}
for(i=0;i<n;i++)
if(a[i]!=i)
boolean=0;
printf("%d\n",boolean);
return boolean;
free(a);
}
但它不适用于某些阵列。我哪里出错了,有更好的方法吗?您不能使用其他数组,程序必须以O(n)运行。
答案 0 :(得分:1)
计算2**a[i]
的总和。如果它不等于(2**n)-1
那么你就错过了一个元素。
答案 1 :(得分:0)
public static boolean arrayCheck(int[] ints) {
for (int i = 0; i < ints.length; i++) {
while (i != ints[i]) {
int currPosVal = ints[i];
if (currPosVal <= i || currPosVal >= ints.length) {
return false;
}
int temp = ints[currPosVal];
if (currPosVal == temp) {
return false;
}
ints[i] = temp;
ints[currPosVal] = currPosVal;
}
}
return true;
}
答案 2 :(得分:0)
利用异或运算的特性。
C++:
bool solve(vector<int>& arr){
int xor = 0;
for (int i = 1; i < arr.size(); i++)
xor ^= i;
for (int v: arr)
xor ^= v;
return xor == 0;
}
或:
bool solve(vector<int>& arr){
int xor = 0;
for (int i = 0; i < arr.size(); i++)
xor ^= i^arr[i];
return xor == 0;
}