当前位置: 首页 > news >正文

算法题——002

地址:复写零

这个题的思路:

双指针法

1.先找到这个要被复制的最后一个点

  • 1.先判断 cur 位置的值

prev 如果是数组的-1索引开始的到最后就是他所在的位置是先加后赋值,这个索引已经被占了的

但是如果是prev 为 0 开始的话,就是先复制后加复制0 这个题

  • 2. 决定 dest 向后移动一步或者两步
  • 3.判断一下 dest 是否已经到结束为止
  • 4.cur ++  
  • 5.处理边界情况(也就是越界 array.length 和 array.length-1为 0 );

仅需把array.length -1 和 array.length 这个位置上的全给变成 0 

cur--;

dest-2;

这三部提前处理一下

2.然后一次往前遍历复制

非0 的就复制一次,cur 赋值该数

0 的复制两次,cur 赋值,prev 记录的是这个要复制的这个数字

注意:

prev 如果是数组的-1索引开始的到最后就是他所在的位置是先加后赋值,这个索引已经被处理的

但是如果是prev 为 0 开始的话,就是先复制后加   

1. prev 初始化为 -1(先加后赋值)  
  • 角色prev 代表 “当前已处理空间的最后一个索引”(初始时无空间,故为 -1)。

  • 处理第一个元素 0(需要占 2 个位置):

    • 先加:prev += 2 → prev = 1(此时prev指向第 2 个位置,即0扩展后占用的最后一个位置)。
    • 后赋值:从后向前复写时,arr[prev--] = 0 → 先写arr[1] = 0,再prev=0;继续arr[prev--] = 0 → 写arr[0] = 0prev=-1
  • 处理第二个元素 1(占 1 个位置):

    • 先加:prev += 1 → prev = 0(指向1应占的位置)。
    • 后赋值:arr[prev--] = 1 → 写arr[0] = 1?不对,这里需要注意:从后向前复写时,prev的 “加” 是在第一阶段计算最终位置,第二阶段复写时是从最终位置向前推

    实际流程中,第一阶段计算完prev最终会停在2[0,0,1]的最后一个索引),第二阶段从2开始向前复写:arr[2] = 1prev=1),再写两个0arr[1]arr[0],逻辑完全匹配。

2. prev 初始化为 0(先复制后加)
  • 角色prev 代表 “下一个待填充的位置起点”(初始时从第 0 位开始)。

  • 处理第一个元素 0

    • 先复制:arr[prev] = 0prev=0),arr[prev+1] = 0prev=0)。
    • 后加:prev += 2 → prev=2(下一个待填充位置是第 2 位)。
  • 处理第二个元素 1

    • 先复制:arr[prev] = 1prev=2)。
    • 后加:prev += 1 → prev=3(超出数组长度,但不影响结果)。

这里第一种主播出现了严重的越界问题,也是调了很长时间的代码

if (arr[cur] == 0) {arr[prev--] = 0;  // 第一次赋值arr[prev] = 0;    // 第二次赋值 - 这里可能prev已经<0!
} else {arr[prev] = arr[cur];  // 这里可能prev已经<0!
}
prev--;
if(prev < 0){  // 检查太晚了!break;
}

在这里在第一次pre-- 的时候就应该考虑越界问题,如果prev = 0 ,prev-- 不就等于-1 了

边界处理:1

// 处理边界问题
if (prev == arr.length) {arr[--prev] = 0;cur--;
} else if (prev == arr.length - 1) {// 也需要处理这种情况arr[prev] = 0;prev--;cur--;
}

2:

3:

   if(prev == arr.length ){arr[--prev] = 0;cur--;prev--;}

import java.util.Arrays;class Solution {public void duplicateZeros(int[] arr) {int cur = 0;int prev = -1;// 第一次遍历: 找到最后一个需要被复制的元素的索引 cur// 循环结束后,cur 将指向最后一个需要处理的元素while (cur < arr.length) {if (arr[cur] == 0) {prev += 2;} else {prev++;}if (prev >= arr.length - 1) {break;}cur++;}// 第二次遍历的写指针,从数组末尾开始int write_ptr = arr.length - 1;// 边界处理:如果 prev 溢出,说明 cur 指向的0只能被复制一次if (prev > arr.length - 1) {arr[write_ptr--] = 0; // 在数组末尾手动放置一个0cur--; // 从 cur 的前一个元素开始第二次遍历}// 第二次遍历:从后向前,将元素复制到正确的位置// cur < arr.length 的检查是为了防止数组只有一个元素且为0的情况for (; cur >= 0 && cur < arr.length; cur--) {if (arr[cur] == 0) {// 如果是0,则复制两次if (write_ptr >= 0)arr[write_ptr--] = 0;if (write_ptr >= 0)arr[write_ptr--] = 0;} else {// 如果不是0,则复制一次if (write_ptr >= 0)arr[write_ptr--] = arr[cur];}}}
}

http://www.dtcms.com/a/585762.html

相关文章:

  • 佛山微信网站开发易语言网站开发教程
  • 从零搭建PyTorch计算机视觉模型
  • 培训课程网站建设淮阳 网站建设
  • 服务器为何成为网络攻击的“重灾区“?
  • Linux rcu机制
  • ES 总结
  • j集团公司的网站建设石家庄百度推广优化排名
  • k8s-node-NotReady后如何保证服务可用
  • 5-GGML:看一下CUDA加法算子!
  • 做网站优化需要做哪些事项wordpress圆圈特效
  • 濮阳网站建设费用网站怎样做外链
  • Docker 部署 Java 项目实践
  • Git push/pull 避坑指南:什么时候加 origin?什么时候不用加?
  • Ubuntu22.04系统中各文件目录的作用
  • 49_AI智能体核心业务之使用Flask蓝图模块化AI智能体服务:构建可维护的RESTful API
  • 网站建设教程数据库网站开发兼职成都
  • 网站 空间 下载行情网免费网站大全
  • 深度学习实战(基于pytroch)系列(五)线性回归的pytorch实现
  • 玩转Rust高级应用. ToOwned trait 提供的是一种更“泛化”的Clone 的功能,Clone一般是从T类型变量创造一个新的T类型变量
  • 11.8 脚本网页 推箱子
  • 网站建设要钱么深圳一百讯网站建设
  • [Java算法] 双指针(1)
  • 江苏省建设厅网站官网湖南做网站最厉害的公司
  • 杭州家具网站建设方案郑州app开发价格
  • gdb调试命令和GDB 到 LLDB 命令映射
  • 【CUDA笔记】02 CUDA GPU 架构与一般的程序优化思路(上)
  • 198种组合算法+优化XGBoost+SHAP分析+新数据预测!机器学习可解释分析,强烈安利,粉丝必备!
  • 东莞做网站要多少钱安顺建设局网站官网
  • 在线做h5 的网站网站服务器怎么查询
  • Vue 项目实战《尚医通》,展示已有医院的数据并分页展示,笔记11