LeetCode(移动零)
题目链接https://leetcode.cn/problems/move-zeroes/题目描述给定一个数组nums编写一个函数将所有0移动到数组的末尾同时保持非零元素的相对顺序。请注意必须在不复制数组的情况下原地对数组进行操作。示例 1:输入:nums [0,1,0,3,12]输出:[1,3,12,0,0]示例 2:输入:nums [0]输出:[0]提示:1 nums.length 104-231 nums[i] 231 - 1思路做题过程碰到的错误错误 1遇到 0 移动后i 不能 你现在代码for(int i0;inums.size();i){ if(nums[i]0) { memmove(...); // 把0删掉 } }错在哪比如数组[0,1,0]i0发现是 0 → 删掉 → 数组变成[1,0]然后i 变成 1直接跳过了新的 i0 位置的 1结果会漏检查元素所以删掉 0 之后 i 不动不 错误 2不是已经在覆盖0的时候个数不是已经变少了吗那为什么还要popmemmove 只是把数据往前挪不会改变 vector 的大小vector 大小不会自己变少我以为memmove(nums[i], nums[i1], 长度);执行完 →数组长度自动 -1错大错特错memmove 只负责拷贝内存不负责修改 vector 大小举个超级直观的例子数组[0,1,2]size 3执行memmove(nums[0], nums[1], 2*sizeof(int));数组变成[1,2,2]size 还是 3没变最后那个2还在0 被覆盖了但数组长度没变短所以必须 pop_back ()因为memmove 往前挪了数据但最后多出来的一个元素还在vector 长度依旧不变class Solution { public: void moveZeroes(vectorint nums) { //计算0的个数 int len0; int i0; while(inums.size()){ if(nums[i]0) { len; //将0覆盖掉 memmove(nums[i],nums[i1],sizeof(int)*(nums.size()-i-1)); //要将数组个数减1 nums.pop_back(); } else{ i; } } //然后末尾再将对应0的个数补齐 for(int i0;ilen;i){ nums.push_back(0); } } };