每日一题:复写0
https://leetcode.cn/problems/duplicate-zeros/
如何避免从左至右遍历每次碰到0都进行搬移的大量重复操作?
方法一:两次遍历,倒序搬移:#
- 第一次遍历,记录0的个数。
- 第二次遍历,从右至左:
维护当前下标i之前的0的个数zeroCount,如当前下标i之前有n个0,那么当前下标i应当被右移n位,在移动之前应当做越界判断。
若当前下标对应数字为0,那么不仅要把这个0移动到n位之后,也要在移动后的左一位也加一个0,并且要把zeroCount减1。
public void duplicateZeros(int[] arr) {
//记录0的个数
int zeroCount=0;
for(int num:arr){
if(num==0){
zeroCount++;
}
}
//倒序遍历数组
for(int i=arr.length-1;i>=0;i--){
boolean isZero = arr[i]==0;
//移动,防止越界
if(i+zeroCount<arr.length){
arr[i+zeroCount]=arr[i];
}
if(isZero){
if(i+zeroCount-1<arr.length){
arr[i+zeroCount-1]=arr[i];
}
zeroCount--;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端