前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣刷题训练(二)

力扣刷题训练(二)

作者头像
lovevivi
发布2022-11-10 14:47:03
2550
发布2022-11-10 14:47:03
举报
文章被收录于专栏:萌新的日常

前言

1.26. 删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 判题标准: 系统会用下面的代码来测试你的题解: int[] nums = [...]; // 输入数组 int[] expectedNums = [...]; // 长度正确的期望答案 int k = removeDuplicates(nums); // 调用 assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; } 如果所有断言都通过,那么您的题解将被 通过。

示例 1: 输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。 示例 2: 输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

代码语言:javascript
复制
int removeDuplicates(int* nums, int numsSize){
     int slow=0;
     int fast=slow+1;
     while(fast<numsSize)
     {
         if(nums[slow]==nums[fast])
         {
             fast++;
         }
         else
         {
             slow=slow+1;
              nums[slow]=nums[fast];
         }
     }
     return slow+1;
}
在这里插入图片描述
在这里插入图片描述

当两者相同时 fast指针向后移>slow指针与fast指针不同 把fast指针所指向的值赋值给slow

在这里插入图片描述
在这里插入图片描述

经过交换后 fast指针又与slow指针所指向的内容相同 所以又将fast赋给slow

在这里插入图片描述
在这里插入图片描述

最后fast指针指到\0 循环结束

2.989. 数组形式的整数加法

整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。

示例 1: 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234 示例 2: 输入:num = [2,7,4], k = 181 输出:[4,5,5] 解释:274 + 181 = 455 示例 3: 输入:num = [2,1,5], k = 806 输出:[1,0,2,1] 解释:215 + 806 = 1021

代码语言:javascript
复制
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    int tmp=k;
    int ksize=0;//判断k的值大小
    while(tmp)
    {
        ksize++;
        tmp=tmp/10;
    }
    int len=ksize>numSize?ksize:numSize;//数组长度大小跟k值大小比较
    int*ptr=(int*)malloc(sizeof(int)*(len+1));//开辟len+1个空间
    int ret=0;
    int sum=0;
    int size=0;
    while(len--)
    {
        int a=0;
       if((numSize-1)>=0)//如果数组下标大于0
       {
         a=num[numSize-1];
         numSize--;
       }
       ret=a+k%10+sum;//记录后面开始的各位相加的值
       k=k/10;
       if(ret>9)//如果ret值>=10 说明要进位
       {
         ret=ret-10;
         ptr[size]=ret;
         sum=1;//将进位的1存起来 留在下一次ret值中相加
       }
       else
       {
           ptr[size]=ret;
           sum=0;//如果这次ret值不进位就将 sum值消掉
       }
       size++;
    }
    if(sum==1)//如果跳出循环 还有进位的情况
    {
        ptr[size]=sum;//就把1赋给后一位
        size++;
    }
    int left=0;
    int right=size-1;
    while(left<right)//将ptr整体逆序 就是结果
    {
        int tmp=0;
        tmp=ptr[left];
        ptr[left]=ptr[right];
        ptr[right]=tmp;
        left++;
        right--;
    }
    *returnSize=size;
    return ptr;
}

这是一道超级复杂的题 各种细节非常多 某个笨蛋 想把数组和k的各位值 相加 然后再借用pow返回 发现报错后面有很大的数 改成long long后 还是通不过

解题思路为 将数组的最后一位与k的最后一位 相加 存放到1个动态开辟的空间中 然后向前依次

在这里插入图片描述
在这里插入图片描述

这样写会发现 ptr中是倒着存的 所以再将其逆序 就是最后结果

在这里插入图片描述
在这里插入图片描述

如果ptr不是从第一个开始存的 即倒着存 就会发现碰到这种情况 倒着存 无法处理

3.88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1: 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。 示例 2: 输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1] 解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。 示例 3: 输入:nums1 = [0], m = 0, nums2 = [1], n = 1 输出:[1] 解释:需要合并的数组是 [] 和 [1] 。 合并结果是 [1] 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。 提示: nums1.length == m + n nums2.length == n 0 <= m, n <= 200 1 <= m + n <= 200 -109 <= nums1[i], nums2[j] <= 109

代码语言:javascript
复制
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
       int *arr=(int*)malloc(sizeof(int)*(m+n));//动态开辟两个数组大小的空间
       int s1=0;
       int s2=0;
       int size=0;
       while(s1<m&amp;&amp;s2<n)//如果两个数组的下标都在范围内
       {
         if(nums1[s1]<nums2[s2])//第一个数组的值<第二个数组的值
         {
             arr[size]=nums1[s1];
             s1++;
             size++;
         }
         else
         {
             arr[size]=nums2[s2];//第二个数组的值<第一个数组的值
             s2++;
             size++;
         }
       }
       while(s1<m)//如果是第一个数组中存在值 九江所有值直接链接在arr中
       {
           arr[size]=nums1[s1];
           s1++;
           size++;
       }
       while(s2<n)//如果是第二个数组中存在值 九江所有值直接链接在arr中
       {
           arr[size]=nums2[s2];
           s2++;
           size++;
       }
       int i=0;
       for(i=0;i<size;i++)
       {
           nums1[i]=arr[i];
       }
      free(arr);
}

这道题很好想到 开辟一块空间 将两个数组中小的值依次放进去 如果有一个没了 有一个还有值 就将值直接放入

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.26. 删除有序数组中的重复项
  • 2.989. 数组形式的整数加法
  • 3.88. 合并两个有序数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档