LeetCode283 移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
方法
双指针法
从头分别找到第一个0和之后第一个非0的数进行交换,然后依次往下找0和非0数交换,即把数组看出非零数组和零数组,从头依次交换直至所有的零都在后面
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public void moveZeroes(int[] nums) {
int str0 = 0; //为0的指针
int str1 = 0;//不为零的指针
while (str1<nums.length){
while (str0<nums.length&&nums[str0]!=0){
str0++;
}
str1 = str0;
while (str1<nums.length&&nums[str1]==0){
str1++;
}
if(str1<nums.length){
int tmp = nums[str0];
nums[str0] = nums[str1];
nums[str1] = tmp;
}
}
}
}
class Solution {
public void moveZeroes(int[] nums) {
int length = nums.length,left=0,right=0;
while(right<length){
if(nums[right]!=0){
swap(nums,left,right);
left++;
}
right++;
}
}
private void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
class Solution {
public void moveZeroes(int[] nums) {
int length = nums.length;
if(nums==null||nums.length<=1) return;
for(int l=0,r=0;r<length;r++){
if(nums[r]!=0){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
}
}
}
}
分类:
LeetCode Hot100
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理