27. 移除元素 - 力扣(LeetCode)
基础知识要求:
Java:方法、for循环、if判断、逻辑运算符、自增自减运算符、关系运算符、数组
Python: 方法、while循环、if判断、逻辑运算符、关系运算符、列表
题目:
给你一个数组 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
思路解析:
为了原地移除所有数值等于val
的元素并返回新数组的长度,我们可以使用双指针的方法。一个指针i
用于遍历整个数组,另一个指针j
用于指向当前不等于val
的元素应该存放的位置。
算法步骤如下:
- 初始化两个指针
i
和j
,都指向数组的起始位置。 - 遍历数组,对于每个
nums[i]
:- 如果
nums[i]
不等于val
,则将nums[i]
的值赋给nums[j]
,并递增j
。 - 如果
nums[i]
等于val
,则只递增i
,因为我们要跳过这个值。
- 如果
- 遍历结束后,
j
的值即为新数组的长度,因为nums[0]
到nums[j-1]
都不包含值为val
的元素。
Java代码示例:
public class Solution {
// 原地移除数组中所有等于给定值的元素,并返回新数组的长度
public int removeElement(int[] nums, int val) {
// 如果数组为空或者长度为0,则直接返回0
if (nums == null || nums.length == 0) {
return 0;
}
// j为慢指针,指向当前不等于val的元素应该存放的位置
int j = 0;
// 遍历整个数组
for (int i = 0; i < nums.length; i++) {
// 如果当前元素不等于val
if (nums[i] != val) {
// 将不等于val的元素放到j的位置
nums[j] = nums[i];
// j向后移动,准备存放下一个不等于val的元素
j++;
}
}
// 返回新数组的长度,即不等于val的元素的个数
return j;
}
public static void main(String[] args) {
Solution solution = new Solution();
// 示例1
int[] nums1 = {3, 2, 2, 3};
int val1 = 3;
int newLength1 = solution.removeElement(nums1, val1);
// 打印新数组(只打印到新长度)
for (int i = 0; i < newLength1; i++) {
System.out.print(nums1[i] + " "); // 输出: 2 2
}
System.out.println();
// 示例2
int[] nums2 = {0, 1, 2, 2, 3, 0, 4, 2};
int val2 = 2;
int newLength2 = solution.removeElement(nums2, val2);
// 打印新数组(只打印到新长度)
for (int i = 0; i < newLength2; i++) {
System.out.print(nums2[i] + " "); // 输出: 0 1 3 0 4
}
}
}
Python代码示例:
def removeElement(nums, val):
# 如果nums为空列表,则直接返回0,因为没有任何元素需要被移除
if not nums:
return 0
# 初始化两个指针i和j,都指向列表的起始位置
# i用于遍历整个列表
# j用于指向当前不等于val的元素应该存放的位置
i = 0
j = 0
# 当i还没有遍历完整个列表时,继续循环
while i < len(nums):
# 如果当前元素nums[i]不等于要移除的值val
if nums[i] != val:
# 将该元素放到j的位置,即覆盖掉原来的nums[j](如果j还没有移动过,则是覆盖自己)
nums[j] = nums[i]
# j向后移动一位,准备存放下一个不等于val的元素
j += 1
# i无论当前元素是否等于val,都需要向后移动一位,继续遍历下一个元素
i += 1
# 当遍历完整个列表后,j的值就是新列表的长度(即不等于val的元素的个数)
return j
# 示例测试
nums = [3, 2, 2, 3]
val = 3
print(removeElement(nums, val)) # 输出: 2,表示新列表的长度为2
print(nums[:2]) # 输出: [2, 2],注意这里只打印了前两个元素作为示例,因为新列表只包含这两个元素
nums = [0, 1, 2, 2, 3, 0, 4, 2]
val = 2
print(removeElement(nums, val)) # 输出: 5,表示新列表的长度为5
print(nums[:5]) # 输出: [0, 1, 3, 0, 4],注意这里只打印了前五个元素作为示例,因为新列表只包含这五个元素
原文地址:https://blog.csdn.net/m0_72231747/article/details/138834479
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!