题源(力扣平台)

解题算法原理:
数组划分/分块题:"双指针"算法---利用数组下标充当"双指针"
为什么?
1.题目要求不创建新的数组空间
2.利用数组下标"随机存取、访问元素"的性质
核心是对数组元素进行分类,分了两大类,在遍历元素进行处理的时候需要第一个cur指针,用来区分已处理和未处理的元素;而另一个des指针则是用于区分已处理的元素中分属地两类
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// //数组长度<=1,无需交换
// if(nums.size() <= 1) return;
// //定义双指针
// int des = -1, cur = 0, n = nums.size();
// //用于元素交换
// int tmp = 0;
// //循环结束条件
// while(cur < n){
// if(nums[cur] == 0) cur++;
// else{
// tmp = nums[des + 1];
// nums[des + 1] = nums[cur];
// nums[cur] = tmp;
// des++;
// cur++;
// }
// }
// return ;
for(int des = -1, cur = 0; cur < nums.size(); cur++){
if(nums[cur] != 0){
swap(nums[++des], nums[cur]);
}
}
}
};
注释部分是自己写的代码
与参考代码相比
可优化点:
1.变量的"可见范围"
// 写法 A - 函数级作用域
int des = -1, cur = 0;
while(cur < n) { ... }
// ❓ 这里 des 和 cur 还能被访问到吗?
// 写法 B - 循环级作用域
for(int des = -1, cur = 0; ...; ...) { ... }
// ❓ 这里 des 和 cur 还能被访问到吗?
问题1:哪种写法能防止后续代码意外修改这两个变量?
2:代码意图
当看到 for(int des = -1, ...) 时,能不能立刻知道:
des只在这个循环里使用?- 循环结束后它就不再重要了?
对比 :如果写在函数开头,后面还有 50 行代码,读者需要怎样判断 des 的使用范围?
3:初始化时机
// A
int des = -1;
// ... 中间可能有其他代码 ...
for(; cur < n; ) { ... }
// B
for(int des = -1; ...; ...) { ... }
问题 :哪种写法能保证 des 一定在使用前被正确初始化?
核心原则
"变量应该在其最小必要作用域内声明"
- 减少意外错误 - 作用域外无法访问
- 代码更清晰 - 声明靠近使用位置
- 便于维护 - 修改时影响范围更小
以上来自AI给出的优化原因
在今后的代码书写中,要遵循"将变量在最近的作用域中优化"的原则