Leetcode:283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解题思路:

排序,两个数遇到0在右边则交换,直到所有0都到了最右边,则停止操作,so easy.

本次主要是来用下cmp,之前发现cmp有贼多问题,遇到两个重复的元素就会报错,因此设计了一个结构体,使得两个结点必然可以比较。结构体如下:

struct node {
        int val;
        int sgn;
        int pos;
        node(int v, int p) {
            val = v;//数值
            sgn = (v == 0 ? 0 : 1);//是否为0
            pos = p;//数值在数组中出现的位置
        }
    };

如果遇到两个数都不为0,比较两个数的位置,不改变原有的排序。因此cmp比较函数如下:

static bool cmp283(node n1, node n2) {
        if (n1.sgn > n2.sgn) return true;
        if (n1.sgn < n2.sgn) return false;
        return n1.pos < n2.pos;
    }

为什么要static呢,因为类中的其他函数(非构造函数)会用到,如果不设置成static就找不到这个函数。

这么一来,node,cmp都可以放入class Solution中,完成封装。

扫描二维码关注公众号,回复: 4373501 查看本文章

C++代码
class Solution {
public:
    struct node {
        int val;
        int sgn;
        int pos;
        node(int v, int p) {
            val = v;
            sgn = (v == 0 ? 0 : 1);
            pos = p;
        }
    };
    static bool cmp283(node n1, node n2) {//一定不能是相同元素,必须可比较
        if (n1.sgn > n2.sgn) return true;
        if (n1.sgn < n2.sgn) return false;
        return n1.pos < n2.pos;

    }
    void moveZeroes(vector<int>& nums) {
        vector<node> n;
        int i, size = nums.size();
        for (i = 1; i <= size; i++) {
            n.push_back(node(nums[i - 1], i - 1));
        }
        sort(n.begin(), n.end(), Solution::cmp283);
        for (i = 1; i <= size; i++) {
            nums[i - 1] = n[i - 1].val;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_23523409/article/details/84550810