力扣刷题3

83 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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);
}