买服务器网站,wordpress与微信小程序,谷歌平台推广,山东新华电脑学院学网站开发题目
给你一个数组 nums 和一个值 val#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k#xff0c;要通过此题#xff0c;您需要执行以下操作#xff1a…题目
给你一个数组 nums 和一个值 val你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k要通过此题您需要执行以下操作
更改 nums 数组使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。 返回 k。
示例 1 输入nums [3,2,2,3], val 3 输出2, nums [2,2,,] 解释你的函数函数应该返回 k 2, 并且 nums 中的前两个元素均为 2。 你在返回的 k 个元素之外留下了什么并不重要因此它们并不计入评测。
示例 2 输入nums [0,1,2,2,3,0,4,2], val 2 输出5, nums [0,1,4,0,3,,,_] 解释你的函数应该返回 k 5并且 nums 中的前五个元素为 0,0,1,3,4。 注意这五个元素可以任意顺序返回。 你在返回的 k 个元素之外留下了什么并不重要因此它们并不计入评测。
int removeElement(int* nums, int numsSize, int val){}思路1
开辟一个与原数组nums大小相同的数组dst并创建一个记录有效数据个数的变量k0。遍历nums当遇到nums[i]val时就将nums[i]放到dst中。最后将dst中的内容memcpy到nums。返回k。
int removeElement(int* nums, int numsSize, int val) {int* dst (int*)malloc(sizeof(int) * numsSize);int k 0;for (int i 0; i numsSize; i){if (nums[i] ! val){dst[k] nums[i];}}nums (int*)memcpy(nums, dst, k * sizeof(int));return k;弊处 额外开辟了空间造成资源浪费
思路2
双指针在原数组上进行修改。 src负责遍历数组dst负责记录有效数据的位置k储存有效数据个数。 src遍历数组的同时判断是否为有效数据如是则dst若不是只有src
int removeElement(int* nums, int numsSize, int val) {
//src和dst都从原数组nums初始位置开始int* src nums;int* dst nums;int k 0;while (src nums numsSize){//src判断完一个数据就if (*src ! val){//只有找到一个有效数据dst才*dst *src;dst;k;}src;}return k;
}双指针避免了额外浪费空间且是单次遍历原数组。 时间复杂度O(n); 空间复杂度O(1)。
双指针不一定就是指针也可以是下标的形式。
双指针
https://blog.csdn.net/xnyxy2431366813/article/details/143966674?fromshareblogdetailsharetypeblogdetailsharerId143966674sharereferPCsharesourcexnyxy2431366813sharefromfrom_link