@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); }
这道题很好想到
开辟一块空间 将两个数组中小的值依次放进去
如果有一个没了 有一个还有值 就将值直接放入