力扣刷题训练 (二)
@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 。不需要考虑数组中超出新长度后面的元素。
当两者相同时 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
这是一道超级复杂的题各种细节非常多某个笨蛋 想把数组和 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
这道题很好想到开辟一块空间 将两个数组中小的值依次放进去如果有一个没了 有一个还有值 就将值直接放入
版权声明: 本文为 InfoQ 作者【lovevivi】的原创文章。
原文链接:【http://xie.infoq.cn/article/df1cfa65f71e2bbc5b84ae2ae】。文章转载请联系作者。
评论