• 力扣刷题训练(二)



    前言


    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    当两者相同时 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    这是一道超级复杂的题
    各种细节非常多
    某个笨蛋 想把数组和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

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

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

  • 相关阅读:
    我的创作纪念日
    【web框架】——Django——如桃花来
    2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级
    论文解读:SlowFast Networks for Video Recognition
    【Redis入门笔记 06】发布和订阅
    拓端tecdat|r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
    使用预约小程序app有什么方便之处
    Kafka生产常见问题分析与总结
    sklearn【Accuracy】准确度介绍和案例学习!
    Bootstrap警告和轮播插件详解【前端Bootstrap框架】
  • 原文地址:https://blog.csdn.net/qq_62939852/article/details/126055167