C链表练习题

C链表练习题leetcode
1.
题目
在这里插入图片描述

思路
在这里插入图片描述
实现

int removeDuplicates(int* nums, int numsSize){
    //若为空数组,则赋值有问题
    if(numsSize == 0)
    return 0;
    //prev指向第一个数 cur指向后一个数(初始为第一个数
    //dst为新数组的下标
    int prev = 0;
    int cur = 1;
    int dst = 0;
    while(cur < numsSize)
    {
        //prev只有一个或者prev为多个相同中的最后一个,将prev赋值给dst
        if(nums[prev] != nums[cur])
        {
            nums[dst] = nums[prev];
            prev++;
            cur++;
            dst++;
        }
        //prev cur指向相同元素
        else
        {
            prev++;
            cur++;
        }
    }
    //此时的下标为新数组的下标
    //此时最后一个唯一的数没有被复制,循环到最后++
    nums[dst] = nums[prev];
    dst++;
    prev++;
    return dst;

}

2
题目
在这里插入图片描述

思路
在这里插入图片描述

实现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
    int KSize=0;//k有多少位
    int KNum=K;
    while(KNum)
    {
        ++KSize;
        KNum/=10;//得到K有多少位
    }
//99+1234 与1234+99不同
    int len=ASize>KSize?ASize:KSize;//获取更大的那位用于开辟空间
    int* retArr= (int*)malloc(sizeof(int)*(len+1));//最多进一位 最大9+9=18
    int Ai=ASize-1;//A数组最后一位,即A最开始的个位
    //得到的结果往reti中存 三位数加三位数可能为三位数,也可能为四位数 所以要倒着存,先放在第0位 最后再逆至
    int reti=0;  //数组下标
    int nextNum=0;//进位
    //len--走len次,--len走len-1次
    while(len--)
    //3-- 返回值为3 --3返回值为2
    //2-- 返回值为2 --2返回值为1
    //0-- 返回值为0
    //最后一组0没有进去。 最后一次1没进去
    {
        int a=0;
        if(Ai>=0)
        {
            a=A[Ai];
             Ai--;//如果是99+1234,获取最大位是4,执行四次循环 若不加条件判断则99减了两次变成负数
        }
        int ret=a+K%10+nextNum;//当Ai是一个负数时 说明A中所有位数相加完毕 把a置为0
       //取前一位
        K/=10;
        //判断是否进位
        if(ret>9)
        {
            ret-=10;//进位后得到个位 15->5
            nextNum=1;
        }
        else
        {
            nextNum=0;//归零 防止影响下一次循环
        }
        retArr[reti]=ret;
        reti++;
    }
    //跳出循环若最后两个值相加>10 处理进位
    if(nextNum==1)
    {
        retArr[reti]=1;//举例:用于两个三位数得到一个四位数的情况,而三位数相加变成四位数首位一定是1
        reti++;
    }
    //最终reti表示的就是数组的最后一位+1(跳出循环之前+1
    //逆置数组
 int left = 0, right =reti-1;
 while (left <= right)
 {
  int tmp = 0;
  tmp = retArr[left];
  retArr[left] = retArr[right];
  retArr[right] = tmp;
  left++;
  right--;
 }
   *returnSize=reti;//输出型参数
    return retArr;
}

3
题目
在这里插入图片描述

思路
在这里插入图片描述

实现

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)
{
    //k有可能大于数组大小
    k%=numsSize;
    //前n-k个逆置,后k个逆置,注意下标问题
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);

}

4
题目
在这里插入图片描述

思路
在这里插入图片描述

实现

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    //遍历数组
    int *tmp = (int*)malloc(sizeof(int)*(m+n));
    //开辟一个新空间存储
    int i1 = 0;
    int i2 = 0;
    int i = 0;//新数组的数
    while(i1 < m && i2 < n)
    {
        //将数组1中小的值往上放
        if(nums1[i1]<nums2[i2])
        {
            tmp[i++]=nums1[i1++];
        }
        else
        {
            tmp[i++]=nums2[i2++];
        }
    }
    //如果i1没有走到尾,把i1复制给tmp
    while(i1<m)
    {
        tmp[i++] = nums1[i1++];
    }
    //如果i2没有走到尾,把i2复制给tmp
    while(i2<n)
    {
        tmp[i++] = nums2[i2++];
    }
    //把tmp拷贝到nums1上
   memcpy(nums1,tmp,sizeof(int)*(m+n));
   free(tmp);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值