给你一个 升序排列 的数组 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 循环结束
整数的 数组形式 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不是从第一个开始存的 即倒着存
就会发现碰到这种情况 倒着存 无法处理
给你两个按 非递减顺序 排列的整数数组 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);
}
这道题很好想到
开辟一块空间 将两个数组中小的值依次放进去
如果有一个没了 有一个还有值 就将值直接放入