首页 > 其他分享 >力扣-283移动零-双指针

力扣-283移动零-双指针

时间:2024-07-06 12:55:12浏览次数:12  
标签:right cur temp nums int 力扣 dest 283 指针

力扣-283移动零-双指针

—、题目解析

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]

二、解题思路

以数组nums = [0,1,0,3,12]为例,我们定义两个变量cur和dest将数组分为三部分,保证[0,dest]全为非0元素,
[dest+1,cur-1]全为0元素,[cur,numSize-1]为未处理元素,cur从左往右遍历数组,当遇到0元素cur++,遇到
非0元素swap(dest+1,cur),dest++,cur++。这个过程和快速排序中找一个中间变量temp,将数组分为两部分,temp前面部分数字小于temp,后面部分数字大于temp。

三、代码实现

C语言实现

void moveZeroes(int* nums, int numsSize)
{
	int left=-1;
	int right=0;
	for(right=0;right<numsSize;right++)
	{
		if(nums[right]!=0)
		{
			left++;
			int temp=nums[left];
			nums[left]=nums[right];
			nums[right]=temp;
		}
	}
} 

Java实现

class Solution {
    public void moveZeroes(int[] nums) 
    {
     for(int cur=0,dest=-1;cur<nums.length;cur++)
     {
        if(nums[cur]!=0)
        {
            dest++;
            int temp=nums[dest];
            nums[dest]=nums[cur];
            nums[cur]=temp;
        }
     }
    }
}

其他写法

void moveZeroes(int* nums, int numsSize) 
 {
     int *arr=calloc(sizeof(int),numsSize);
     int i=0;
     int j=0;
     for(i=0;i<numsSize;i++)
     {
 		if(nums[i]!=0)
 		{
 			arr[j++]=nums[i];
 		}
 	}
 	for(int i=0;i<numsSize;i++)
 	{
 		nums[i]=arr[i];
 	}
 }

欢迎留言讨论。

标签:right,cur,temp,nums,int,力扣,dest,283,指针
From: https://blog.csdn.net/2403_82759827/article/details/140223761

相关文章

  • 基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283
     摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......
  • 第18节 指针与数组
    文章目录第18节指针与数组1.一维数组与指针2.指针与字符串第18节指针与数组1.一维数组与指针►C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。►1.一维数组的地址 ►数组由若干个元素组成,每个元素都有相应的地址,通过......
  • 第19节 指针与函数
    文章目录第19节指针与函数1.指针作为函数的参数1、指针作为函数的参数2、数组作为函数的参数2.引用和指向函数的指针3、引用4、指向函数的指针第19节指针与函数1.指针作为函数的参数1、指针作为函数的参数►指针最重要的应用是作为函数参数,它使得被调函数......
  • 【力扣】每日一题—第88题,合并两个有序数组
    目录题目暴力求解思路:通过代码:拓展学习:最终代码如下:题目给你两个按**非递减顺序**排列的整数数组`nums1`和`nums2`,另有两个整数`m`和`n`,分别表示`nums1`和`nums2`中的元素数目。请你**合并**`nums2`到`nums1`中,使合并后的数组同样按**非递减顺序*......
  • 【力扣】每日一题—第35题,搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。注意点:没有这个数要返回大于这个数的下标思想:for循环找到target的值,返回下标,加判断如果没有这个值,找出小于这个值和第二个数大于的区间,将第二个......
  • 【leetcode】双指针算法题
    文章目录1.算法思想2.移动零3.复写零方法一方法二4.快乐数5.盛水最多的容器方法一(暴力求解)方法二(左右指针)6.有效三角形的个数方法一(暴力求解)方法二(左右指针)7.两数之和8.三数之和9.四数之和1.算法思想常见的双指针有两种形式,⼀种是左右指针,⼀种是快慢指针。左右......
  • C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结
    C++结构体C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中的const的使用场景,以及结构体的案例。1.结构体的定义和使用结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。......
  • 函数指针 和 指针函数区别以及使用方法
    问题由来:typedefint(*UaBase_ComFunction)(void);UABASE_API(int)UaBase_RegisterComFunction(UaBase_ComFunctiona_pFunction);UABASE_API(int)UaBase_UnregisterComFunction(UaBase_ComFunctiona_pFunction);上述代码的作用:声明的一个函数指针(函数类型的指针),作为函数形......
  • const修饰指针变量和assert断言
    一.const修饰指针变量一般来说,const修饰指针变量,可以放在*的左边,也可以放在*的右边,两个表示方法的意义是不一样的。1.代码1——测试无const修饰的情况voidtest1(){ intn=10; intm=20; int*p=&n; *p=20;//1 p=&m;//2}在这个代码中1和2所在的语句均可以......
  • 函参中的双重指针
    在学习swap函数时,若想改变实参,可以将函参设置为指针类型。那么函参中的双重指针,也是这种含义。即想改变实参(指针类型)的指向或值时,可以用双重指针。若只是想改变值,可以使用单指针。voidchange(char*p){p="bbb";}intmain(){char*v="aaa";change(v......