算法学习记录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 时,一定要思考"刚好越界"的情况。

相关推荐
是隼人9 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
大衛說10 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
吃好睡好便好11 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学运维的Kysan11 小时前
暑假运维学习打卡第二十九天8.29
学习
zbyyd12 小时前
Linux 进程间通信学习笔记
linux·笔记·学习
一条破秋裤12 小时前
02_软件安装与新建工程
学习
来了就未晚12 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
GHL28427109012 小时前
用codex做一个简单技能学习
学习·ai
西西弗Sisyphus13 小时前
模型训练 不同批次大小与学习率下的训练损失对比(2)
学习·batchsize·lr·learning rate
软件开发技术深度爱好者14 小时前
在线学习实践 TypeScript 的官方Playground(演练场)使用介绍
javascript·学习·typescript