算法学习记录DAY2

张开发
2026/4/9 8:08:55 15 分钟阅读

分享文章

算法学习记录DAY2
题源(力扣平台)解题原理先考虑“异地拷贝数组“进行复写操作。然后考虑从左往右进行原地复写但是发现这个过程中会覆盖掉未处理却应该处理的数据。于是考虑从右往左进行复写则分为两步:1.找到最后一个需要复写的数字2.从后往前进行复写class Solution { public: void duplicateZeros(vectorint arr) { //1、找最后一个需要复写的数字---数组下标 int des -1 , cur 0, n arr.size(); while(cur n ){ if(arr[cur] ! 0) des1; else des2; if(des n - 1) break; cur; } //我的错解 //while(des n ){ // if(arr[cur] ! 0) des1; // else des2; // cur; //} cout cur; //2.从后向前进行复写 //结束条件cur 0 if(des n){ arr[n-1] 0; des-2;cur--; } while(cur0 des 0){ if(arr[cur] 0){ arr[des] arr[des - 1] 0; des-2; } else { arr[des] arr[cur]; des--; } cur--; } // for(int des -1,cur 0;des arr.size();cur){ // if(arr[cur] ! 0) des; // else des2; // cout des; // } } };我的出错点1.在找最后一个需要复写的元素下标时没有搞清楚循环结束情况,写成了des n时结束循环。这是因为对”双指针算法“的错误理解与思路的不清晰des是因为cur才有变化的所以循环主体判断条件应该是cur而不是des本末倒置了des在n时确实是需要考虑到的边界情况但是并没有考虑清楚des在越界时的真正含义2.没考虑到特殊边界情况最后一个复写元素为0时以及处理方式不对由1.能考虑到desn-1时就应该有两种情况。des n -1;des n;而对应的复写操作中访问了arr[des]此时就已经越界就算考虑不到最后一个复写元素为0的情况也应该考虑到数组访问的这种边界情况。总结如何能在第一次写的时候就考虑全面deepseek给我的建议;编写算法时的思维习惯画图用下标模拟每一步的变化。考虑极端值最小长度1、全零、零出现在不同位置。关注索引变化当增量可能为 2 时一定要思考“刚好越界”的情况。

更多文章