LeetCode移除元素代码未通过问题排查及错误原因分析
LeetCode移除元素问题代码错误分析
问题背景
我用Java编写了解决LeetCode移除元素问题的代码,本地编译器运行输出结果正确,但提交到LeetCode后未通过,想搞清楚原代码的问题所在。
题目要求:给定整数数组nums和整数val,原地移除nums中所有等于val的元素,元素顺序可改变,返回nums中不等于val的元素数量。
原代码
// Online Java Compiler // Use this editor to write, compile and run your Java code online import java.util.*; class HelloWorld { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the size of the array"); int n=sc.nextInt(); int[] nums = new int[n]; int k=0, val; System.out.println("Enter the elements"); for(int i=0;i<nums.length;i++){ nums[i] = sc.nextInt(); } System.out.println("Enter the value to remove"); val=sc.nextInt(); for(int i=0;i<(nums.length);i++){ if(nums[i]==val){ nums[i]=nums[i]-val; k++; } } System.out.println("Here are number of elements left "+(nums.length-k)+" Numbers are deleted "+k); } }
本地运行示例结果
Enter the size of the array 4 Enter the elements 2 3 3 2 Enter the value to remove 2 Here are number of elements left 2 Numbers are deleted 2
原代码错误原因
你误解了LeetCode题目的核心要求:
- 题目要求原地修改数组,并且需要保证数组的前k个元素(k是你返回的有效元素数量)全部是不等于val的有效元素。你的代码只是把等于val的元素改成了
nums[i]-val(比如val=2时就是0),但这些被修改的元素仍然留在数组的原位置,LeetCode的判题器会检查数组的前k个元素是否符合要求,显然你的数组里还存在这些无效的标记值,不符合判题标准。 - 你的逻辑仅统计了需要删除的元素数量,计算出有效元素的数值,但没有真正将有效元素移动到数组的前半部分,判题器不仅校验返回的数值,还会验证数组的实际内容是否符合“移除所有val”的要求。
正确解法对比
修改后的代码通过将所有不等于val的元素依次覆盖到数组的前k个位置,既统计了有效元素数量k,又保证了数组前k个位置都是有效元素,完全符合题目“原地移除”的要求,因此提交成功:
for (int i = 0; i < (nums.length); i++) { if (nums[i] != val) { nums[k] = nums[i]; k++; } }
内容的提问来源于stack exchange,提问作者Aman Sharma
相关产品推荐
相关产品推荐

