算法学习记录DAY2

题源(力扣平台)

解题原理:

先考虑"异地拷贝数组",进行复写操作。然后考虑从左往右进行原地复写,但是发现这个过程中会覆盖掉未处理却应该处理的数据。于是考虑从右往左进行复写,则分为两步:

1.找到最后一个需要复写的数字

2.从后往前进行复写

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        //1、找最后一个需要复写的数字---数组下标
        int des = -1 , cur = 0, n = arr.size();
        while(cur < n ){
            if(arr[cur] != 0) des+=1;
            else des+=2;
            if(des >= n - 1) break;
            cur++;
        }
        //我的错解:
        //while(des < n ){
        //  if(arr[cur] != 0) des+=1;
        //  else des+=2;
        //  cur++;
      //}
        cout << cur;
         //2.从后向前进行复写
         //结束条件:cur < 0
         if(des == n){
            arr[n-1] = 0;
            des-=2;cur--;
         }
         while(cur>=0 && 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 des+=2;
        //     cout << des;
        // }
       
    }
};

我的出错点:

1.在找最后一个需要复写的元素下标时,没有搞清楚循环结束情况,写成了des > n时结束循环。

这是因为对"双指针算法"的错误理解与思路的不清晰:des是因为cur才有变化的,所以循环主体判断条件应该是cur,而不是des,本末倒置了;des在>n时确实是需要考虑到的边界情况,但是并没有考虑清楚des在越界时的真正含义

2.没考虑到特殊边界情况(最后一个复写元素为0时),以及处理方式不对

由1.能考虑到des>=n-1时,就应该有两种情况。des = n -1;des = n;

而对应的复写操作中,访问了arrdes此时就已经越界,就算考虑不到最后一个复写元素为0的情况,也应该考虑到数组访问的这种边界情况。

总结:

如何能在第一次写的时候就考虑全面?

deepseek给我的建议;

编写算法时的思维习惯

  • 画图:用下标模拟每一步的变化。

  • 考虑极端值:最小长度(1)、全零、零出现在不同位置。

  • 关注索引变化:当增量可能为 2 时,一定要思考"刚好越界"的情况。

相关推荐
敬往事一杯酒哈7 小时前
海康 AGV 导航读码器学习
学习
qq_284274059 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_2842740510 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan202411 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
小雪崩12 小时前
嵌入式学习 day64:字符设备驱动
学习
个 人 练 习 生12 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
坤坤子吖13 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
词却14 小时前
OpenCV学习:MediaPipe 人脸网格检测
opencv·学习
李日华大战鸡红14 小时前
FOC SVPWM过调制(学习记录)
stm32·单片机·学习
AI职业加油站15 小时前
AI 校招现状:大模型应用工程师证书,助力简历能力证明
大数据·运维·人工智能·学习·职场发展