力扣刷题训练(二)

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

@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 + 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);
}

这道题很好想到

开辟一块空间 将两个数组中小的值依次放进去

如果有一个没了 有一个还有值 就将值直接放入

目录
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
50 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
17 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
58 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
28 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
51 3