我正在练习一些leetcode,而且我对它还很陌生。所以,就出现了这个问题,需要将0右移。我编写了代码,输出按预期进行,但结果是
[]
。
谁能解释一下出了什么问题吗?
这是我的代码片段。
这是结果。
正如您在
stdout
中可以清楚地看到的,输出是正确的,但答案是一个空列表。我究竟做错了什么?我感谢您的帮助。谢谢。
好的,这个问题是基于就地操作的,你的逻辑是非常正确的。我会用 3 件事来解释,这样你就会清楚了。
1。良好的编程习惯:-
输出结果为[],因为第19行有明确的说明
//19 nums.clear();
//20 nums=nonZeroArray;
想法:- nums 被清除。 nonZeroArray 的内容被复制到 nums。
实际情况:-但是在这种情况下,如果我们使用clear,那么结果将被清除,即[]并且第20行没有任何影响。
证明:- ->由于问题是原地遍历,所以不要使用clear语句。这是不好的编程习惯。 你可以尝试这个而不是第 19 行和第 20 行
for(int i=0; i<nums.length; i++)
{
nums[i]=nonZeroArray[I];
}
不要使用clear,而不是逐个元素复制,您将得到结果。
2。逻辑修正:- 即使这样做之后,您也会收到错误,因为代码中存在逻辑错误。
问题说数组是否为[0,1,0,3,12]。输出应为 [1,3,12,0,0]。将零推到末尾。
第2行,不需要排序功能。假设以 arr=[0,2,1] 为例。输出应该是[2,1,0]。如果我们在第 2 行排序,那么输出将是 [1,2,0],这是错误的。所以不要排序。
最终更正后的代码将是:-
class Solution {
void moveZeroes(List<int> nums) {
List<int> nonZeroArray=[];
for(int i=0; i<nums.length; i++){
if(nums[i]!=0){
nonZeroArray.add(nums[i]);
}
}
if(nums.length != nonZeroArray.length){
int rem=nums.length-nonZeroArray.length;
for(int i=0; i<rem; i++){
nonZeroArray.add(0);
}
// print(nonZeroArray);
}
// nums.clear();
// nums=nonZeroArray;
for(int i=0; i<nums.length; i++)
{
nums[i]=nonZeroArray[I];
}
}
}
3.使用就地遍历的良好编程实践 -> 不要尝试使用其他变量(比如她的 nonZeroArray)。尝试在 nums 本身中解决,以防就地遍历,
替代代码:-
class Solution {
void moveZeroes(List<int> nums) {
int listLenght = nums.length;
nums.removeWhere((element) => element == 0);
int listRemaningLenght = listLenght - nums.length;
for (var i = 0; i < listRemaningLenght; i++) {
nums.add(0);
}
}
}
我希望这能消除你的疑虑。
谢谢你。 快乐编码。
问候:-
拉克沙斯·U·谢蒂