力扣面试经典题之数组/字符串
简单
给你两个按?非递减顺序?排列的整数数组?
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 i=0,j=0,re[m+n+1],k=0; while(true){ if(i<m&&j<n){ if(nums1[i]>nums2[j]){ re[k++]=nums2[j++]; } else{ re[k++]=nums1[i++]; } }else if(i==m&&j<n){ re[k++]=nums2[j++]; }else if(j==n&&i<m){ re[k++]=nums1[i++]; } else{ break; } } for(int i=0;i<m+n;i++){ nums1[i]=re[i]; } }
简单
给你一个数组?
nums
?和一个值?val
,你需要?原地?移除所有数值等于?val
?的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用?
O(1)
?额外空间并?原地?修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { ? ? print(nums[i]); }示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,3,0,4] 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
int removeElement(int* nums, int numsSize, int val) { for(int i=0;i<numsSize;){ if(nums[i]==val){ for(int j=i;j<numsSize-1;j++){ nums[j]=nums[j+1]; } numsSize--; }else{ i++; } } return numsSize; }
已解答
简单
相关标签
相关企业
提示
给你一个?非严格递增排列?的数组?
nums
?,请你?原地?删除重复出现的元素,使每个元素?只出现一次?,返回删除后数组的新长度。元素的?相对顺序?应该保持?一致?。然后返回?nums
?中唯一元素的个数。考虑?
nums
?的唯一元素的数量为?k
?,你需要做以下事情确保你的题解可以被通过:
- 更改数组?
nums
?,使?nums
?的前?k
?个元素包含唯一元素,并按照它们最初在?nums
?中出现的顺序排列。nums
?的其余元素与?nums
?的大小不重要。- 返回?
k
?。判题标准:
系统会用下面的代码来测试你的题解:
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 。不需要考虑数组中超出新长度后面的元素。提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
?已按?非严格递增?排列int removeDuplicates(int* nums, int numsSize) { for(int i=0;i<numsSize-1;){ if(nums[i]==nums[i+1]){ for(int j=i+1;j<numsSize-1;j++){ nums[j]=nums[j+1]; } numsSize--; }else{ i++; } } return numsSize; }
中等
给你一个有序数组?
nums
?,请你?原地?删除重复出现的元素,使得出现次数超过两次的元素只出现两次?,返回删除后数组的新长度。不要使用额外的数组空间,你必须在?原地?修改输入数组?并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { ? ? print(nums[i]); }示例 1:
输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3] 解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3] 输出:7, nums = [0,0,1,1,2,3,3] 解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为?0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
?已按升序排列int removeDuplicates(int* nums, int numsSize) { int pre=0; for(int i=1;i<numsSize;){ if(nums[i]>nums[pre]){ nums[++pre]=nums[i]; i++; }else{ nums[++pre]=nums[i]; int k; for(k=i+1;k<numsSize;k++){ if(nums[k]!=nums[i]){ break; } } i=k; } } return pre+1; }
简单
给定一个大小为?
n
?的数组?nums
?,返回其中的多数元素。多数元素是指在数组中出现次数?大于?? n/2 ?
?的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例?1:
输入:nums = [3,2,3] 输出:3示例?2:
输入:nums = [2,2,1,1,1,2,2] 输出:2提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
#include<stdlib.h> int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b; } int majorityElement(int* nums, int numsSize) { int mm; mm=numsSize/2; qsort(nums,numsSize,sizeof(nums[0]),cmp); for(int i=0;i<numsSize;){ int k=0,j; for(j=i+1;j<numsSize;j++){ if(nums[i]!=nums[j]){ break; } } if((j-i)>mm){ return nums[i]; }else{ i=j; } } return 0; }
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!