写点什么

力扣刷题训练 (二)

作者:lovevivi
  • 2022-10-25
    吉林
  • 本文字数:2909 字

    阅读完需:约 10 分钟

@TOC



前言


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 。不需要考虑数组中超出新长度后面的元素。


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


/** * 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 + nnums2.length == n0 <= m, n <= 2001 <= m + n <= 200-109 <= nums1[i], nums2[j] <= 109


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&&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);}
复制代码


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

发布于: 刚刚阅读数: 3
用户头像

lovevivi

关注

还未添加个人签名 2022-10-12 加入

还未添加个人简介

评论

发布
暂无评论
力扣刷题训练(二)_数据结构_lovevivi_InfoQ写作社区