Leetcode:283.移動零
阿新 • • 發佈:2018-12-05
給定一個數組 nums
,編寫一個函式將所有 0
移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入:[0,1,0,3,12]
輸出:[1,3,12,0,0]
說明:
- 必須在原陣列上操作,不能拷貝額外的陣列。
- 儘量減少操作次數。
解題思路:
排序,兩個數遇到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中,完成封裝。
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 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; } } }; |