即使输出正确,答案也显示不同

问题描述 投票:0回答:1

我正在练习一些leetcode,而且我对它还很陌生。所以,就出现了这个问题,需要将0右移。我编写了代码,输出按预期进行,但结果是

[]
。 谁能解释一下出了什么问题吗? 这是我的代码片段。

这是结果。

正如您在

stdout
中可以清楚地看到的,输出是正确的,但答案是一个空列表。我究竟做错了什么?我感谢您的帮助。谢谢。

dart data-structures
1个回答
0
投票

好的,这个问题是基于就地操作的,你的逻辑是非常正确的。我会用 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·谢蒂

© www.soinside.com 2019 - 2024. All rights reserved.