给定一个数组 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中,完成封装。
扫描二维码关注公众号,回复:
4373501 查看本文章
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; } } }; |