轮转数组
链接: link
本题注意要点:一定要注意轮转k个位置的k,是否超出数组元素个数,所以每个方法前面我们都要加上k%=numsSize
题目描述:
法1:暴力求解
void rotate(int* nums, int numsSize, int k)
{
int i = 0;
k %= numsSize;//!
while (k--)
{
int tmp = nums[numsSize - 1];//保存最后一个元素
int j = 0;
for (j = numsSize - 1; j > 0; j--)
{
nums[j] = nums[j - 1];
}
nums[0] = tmp;
}
}
法2:三段逆置方法
void reverse(int* nums,int x,int y)
{
int tmp = 0;
while(x<y)
{
tmp=nums[x];
nums[x]=nums[y];
nums[y]=tmp;
x++;
y--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k%=numsSize;
reverse(nums,0,numsSize-1);//整体逆置
reverse(nums,0,k-1);//前k个逆置
reverse(nums,k,numsSize-1);//后n-k个逆置
//下标
}
法3:以空间换时间
void rotate(int* nums, int numsSize, int k)
{
k%=numsSize;
int* tmp = (int*)malloc(sizeof(int)*numsSize);
if(tmp == NULL)
{
perror("malloc");
return;
}
int i = 0;
int pos = 0;
for(i=numsSize-k;i<numsSize;i++)
{
tmp[pos++]=nums[i];
}
for(i=0;i<numsSize-k;i++)
{
tmp[pos++]=nums[i];
}
for(i=0;i<numsSize;i++)
{
nums[i]=tmp[i];
}
free(tmp);
tmp = NULL;
}
消失的数字
链接: link
题目描述:
代码实现:
int missingNumber(int* nums, int numsSize)
{
int i = 0;
int res = 0;
for(i=0;i<numsSize;i++)
{
res^=nums[i];
}
for(i=0;i<numsSize+1;i++)
{
res^=i;
}
return res;
}