1. 程式人生 > >Leetcode:283.移動零

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中,完成封裝。

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;
        }
    }
};