• leetCode #283 move zeroes


    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

    解法一

    ->  从nums[0]开始,依次扫描0的个数count,每个元素都应该向前移动count个位置,最后再将最后count个元素赋值为0

    实现如下:

     1 class Solution {
     2 public:
     3     void moveZeroes(vector<int>& nums) {
     4         int count = 0;
     5         for (int i = 0; i < nums.size(); ++i)
     6         {
     7             if (nums[i] != 0)
     8             {
     9                 nums[i - count] = nums[i];
    10             }
    11             else
    12             {
    13                 ++count;
    14             }
    15         }
    16         while (count)
    17         {
    18             nums[nums.size() - count] = 0;
    19             --count;
    20         }
    21     }
    22 };

    解法二

    ->  扫描一遍nums中的元素,用p来表示可以放置非零元素的索引。只有当扫描的元素非零时,我们需要将这个元素放置到p的位置,并将p的位置再向后挪。

    或这样理解:

    ->  将nums中非零元素全部放置在[0,p) 这个区间,剩余的部分赋值为0

    代码如下

     1 class Solution {
     2 public:
     3     void moveZeroes(vector<int>& nums) {
     4         int p = 0;
     5         for (int i = 0; i < nums.size(); ++i)
     6         {
     7             if (nums[i])
     8             {
     9                 nums[p++] = nums[i];
    10             }
    11         }
    12         for (int j = p; j < nums.size(); ++j)
    13         {
    14             nums[j] = 0;
    15         }
    16     }
    17 };

    细心的你可能已经发现了,解法一和解法二本质是一样的,只是一个记录的是跨度count,一个记录的是下标p。

    解法三

    我们对上面的步骤进行优化,也就是把赋值(=)换成交换(swap()),这样就无需再对后面的0元素赋值了。

    代码如下:

     1 class Solution {
     2 public:
     3     void moveZeroes(vector<int>& nums) {
     4         int p = 0;
     5         for (int i = 0; i < nums.size(); ++i)
     6         {
     7             if (nums[i])
     8             {
     9                 swap(nums[p++], nums[i]);
    10             }
    11         }
    12     }
    13 };

    优化解法三

    考虑没有0元素的情况,那么原始的解法三会出现元素与自己交换的情况,对此,我们对两种情况进行处理,即,若i==p和i!=p这两种情况,前者并不需要做swap。

    改进后的代码如下:

     1 class Solution {
     2 public:
     3     void moveZeroes(vector<int>& nums) {
     4         int p = 0;
     5         for (int i = 0; i < nums.size(); ++i)
     6         {
     7             if (nums[i])
     8             {
     9                 if (i != p)
    10                 {
    11                     swap(nums[p++], nums[i]);    
    12                 }
    13                 else
    14                 {
    15                     ++p;
    16                 }
    17             }
    18         }
    19     }
    20 };

  • 相关阅读:
    一个自动化测试工具 UI Recorder
    通俗理解http2.0
    IE 问题集合
    webpack
    性能工具集合
    网络 问题
    css命名规范
    ajax 总结
    CSS深入理解学习笔记之relative
    jQuery插件开发通用框架
  • 原文地址:https://www.cnblogs.com/xiaoyajiang/p/7833195.html
Copyright © 2020-2023  润新知