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

3qpi33ja  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(64)

我正在练习一些leetcode,我对它很陌生。所以,有一个问题,你需要将0向右移动。我写了代码,输出如预期的那样,但结果产生了[]。有人能解释错在哪里吗?这里是我的代码片段.

这就是结果。



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

knpiaxh1

knpiaxh11#

好的,这个问题是基于原地操作的,你的逻辑很正确。我会用三件事来解释,这样你就清楚了。

1.良好的编程实践:-

输出结果为[],因为第19行中有明确的语句

//19 nums.clear();
//20 nums=nonZeroArray;

字符串

**思路:-**nums被清除,nonZeroArray的内容被复制到nums。
**实际情况:-**但在这种情况下,如果我们使用clear,那么结果将被清除,即[]和第20行没有任何影响。
Proof:-->由于问题是在原地遍历,所以不要使用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行,不需要排序函数。假设以k =[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);
   }
 }
}


我希望这消除了你的疑虑。
谢谢编程快乐
谨致问候:

Rakshath U Shetty,伊斯坦布尔

相关问题