携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
题目描述
解题思路1
另开辟一个数组,重新开辟的数组长度比原来的大一。里面的元素都初始化为-1,原数组里面的元素对应从新开辟数组的下标
代码
int missingNumber(int* nums, int numsSize){
int* num=(int*)malloc((numsSize+1)*sizeof(int));
int i=0;
for(i=0;i<numsSize+1;i++)
{
num[i]=-1;
}
for(i=0;i<numsSize;i++)
{
num[nums[i]]=nums[i];
}
for(i=0;i<numsSize+1;i++)
{
if(num[i]==-1)
break;
}
free(num);
num=NULL;
return i;
}
解题思路2
- 用数字0把数组里面的元素全部异或
^,同时和0—N(N为原数组长度)的数字再次进行异或,结果就是缺少的数。
代码
int missingNumber(int* nums, int numsSize){
int i=0,x=0;
for(i=0;i<numsSize;i++)
{
x^=nums[i];
x^=i;
}
return x^numsSize;
}
解题思路3
- 把
0到n的数全部进行相加,然后减去数组里面的数 - 虽然可以通过,但是数组长度过大时,会有越界的风险
代码
int missingNumber(int* nums, int numsSize){
int i=0,x=0;
for(i=0;i<numsSize;i++)
{
x+=i;
x-=nums[i];
}
return x+numsSize;
}
题目描述
解题思路
- 思路1
再次创建一个同等的大小的数组a,把原数组后k个位置的元素
拷贝a数组的前k个位置。然后原数组剩下的元素拷贝在a数组剩余的位置。 最后把a数组全部的元素再次拷贝到原数组中。 ==时间复杂度O(n),空间复杂度O(n)== - 思路2 ==三步逆序(就是一个规律) 第一步:把后k个逆序 第二步:把剩下的逆序 第三步:全部逆序== 时间复杂度O(n),空间复杂度O(1)
代码
思路1代码
void rotate(int* nums, int numsSize, int k){
k%=numsSize;//保证轮转数小于数组长度
int* a=(int*)malloc(numsSize*sizeof(int));
if(a==NULL)
return;
int i=0,j=0;
for(i=numsSize-k;i<numsSize;i++)
{
a[j++]=nums[i];
}
for(i=0;i<numsSize-k;i++)
{
a[j++]=nums[i];
}
for(i=0;i<numsSize;i++)
{
nums[i]=a[i];
}
free(a);
a=NULL;
}
思路2代码
void reverse(int* s1,int* s2)
{
int temp=0;
while(s1<s2)
{
temp=*s1;
*s1=*s2;
*s2=temp;
s1++;
s2--;
}
}
void rotate(int* nums, int numsSize, int k){
k%=numsSize;
reverse(nums+numsSize-k,nums+numsSize-1);
reverse(nums,nums+numsSize-k-1);
reverse(nums,nums+numsSize-1);
}