1.题目:数组nums包含从0到n 的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
思路1:排序(qsort快排--时间复杂度:O(nlog2N))
思路2:(0+1+2+3+..+n)-(a[0]+a[1]+...+a[n-1]) 时间复杂度:O(N)
int missingNumber(int*nums,int numsSize)
{
int x=0;
//跟[0,n]异或
for (int i=0;i<=numsSize;++i)
{
x^=i;
}
//再跟数组中的值异或
for(int i=0;i<numsSize;++i)
{
x^=nums[i];
}
return x;
}
2.题目:旋转数组
给定一个数组,将数组中的元素向右移动k个位置,其中k 是非负数。
思路1:暴力求解,旋转K次
时间复杂度:O(N*K)
空间复杂度:O(1)
思路2:开辟额外空间以空间换时间
时间复杂度:O(N)
空间复杂度:O(N)
思路3:前n-k个逆置,后k个逆置,整体逆置。
时间复杂度:O(N)
空间复杂度:O (1)
void Reverse(int* nums,int left,int right)
{
while(left<right)
{
int tmp=nums[left];
nums[left]=nums[right]
nums[right]=tmp;
++left;
--right;
}
}
void rotate(int*nums,int numsSize,int k)
{
if(k>=numsSize)
k%=numsSize;
//前n-k个数逆置
Reverse(nums,0,numsSize-k-1);
//后k个数逆置
Reverse(nums,numsSize-1);
// 整体逆置
Reverse(nums,0,numsSize-1);
}