LeetCode每日一题(12)——按奇偶排序数组(双指针)

简介: 按奇偶排序数组1.题目2.示例3.思路4.代码

1.题目


给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。


返回满足此条件的 任一数组 作为答案。


2.示例


示例 1:


输入:nums = [3,1,2,4]

输出:[2,4,3,1]

解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3]也会被视作正确答案。


示例 2:


输入:nums = [0]

输出:[0]


提示:


1 <= nums.length <= 5000

0 <= nums[i] <= 5000


3.思路


题目很简单,我最先想到的是分别找出所有偶数和奇数,再进行拼接。但是感觉这样需要额外的空间,所以想到了双指针,直接修改原数组的顺序。

从数组的两端同时遍历,左端指针位置遇到奇数与右端指针位置交换数据,右端指针位置遇到偶数与左端指针位置交换数据,奇偶符合要求则指针向中间移动,相遇则排序完成。


4.代码


func sortArrayByParity(nums []int) []int {
  front := 0
  after := len(nums)-1
  var temp,i int
  for after > front {
    fmt.Println(i)
    i++
    if nums[front] % 2 != 0 {
      temp = nums[front]
      nums[front] = nums[after]
      nums[after] = temp
      fmt.Printf("%v和%v交换位置\n",nums[front],nums[after])
    }else {
      front++
    }
    if nums[after] % 2 == 0 {
      temp = nums[after]
      nums[after] = nums[front]
      nums[front] = temp
      fmt.Printf("%v和%v交换位置\n",nums[after],nums[front])
    }else {
      after--
    }
  }
  return nums
}
相关文章
|
19天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
18天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
29 2
|
27天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
31 1
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
19 1
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
19 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
19 0
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
60 0