网络服务商的责任保定网站优化排名
- 题目描述
 - 解题思路
 - 执行结果
 
 题目描述
-  
按奇偶排序数组  
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。
示例 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
解题思路
法1
记录拼接法\
1.使用两个数组分别记录奇数和偶数
-  
循环遍历数组,将数据记录在奇数数组与偶数数组中
 -  
最后拼接输出结果数组
 
-  
时间复杂度(O(n))  -  
空间复杂度(O(n))  
法2
方法2:双指针\
-  
两个指针分别指向头节点与尾节点
 -  
当尾节点为偶数,头节点为奇数时,交换位置
 
最后输出该数组
-  
时间复杂度(O(n))  -  
空间复杂度(O(1))  
执行结果
法1
略
法2
我们使用两个指针 left 和 right 分别指向数组的开头和末尾。通过迭代比较指针位置的元素,我们可以将偶数元素移到数组的前面,奇数元素移到数组的后面。
具体的操作如下:
如果左指针指向偶数,右指针指向奇数,则左指针右移一位,右指针左移一位。
如果左指针指向奇数,右指针指向偶数,则交换左右指针位置的元素,并将左指针右移一位,右指针左移一位。
如果左指针指向偶数,右指针也指向偶数,则左指针右移一位。
如果左指针指向奇数,右指针也指向奇数,则右指针左移一位。
最终,当左指针大于等于右指针时,所有的偶数元素都已经移动到了数组的前面,而奇数元素则移动到了数组的后面。
left := 0
 right := len(nums) - 1
 for left < right {
  // 左指针指向偶数,右指针指向奇数
  if nums[left]%2 == 0 && nums[right]%2 != 0 {
   left++
   right--
  } else if nums[left]%2 != 0 && nums[right]%2 == 0 { // 左指针指向奇数,右指针指向偶数
   nums[left], nums[right] = nums[right], nums[left]
   left++
   right--
  } else if nums[left]%2 == 0 && nums[right]%2 == 0 { // 左指针指向偶数,右指针也指向偶数
   left++
  } else { // 左指针指向奇数,右指针也指向奇数
   right--
  }
 }
 return nums
 执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 8 ms , 在所有 Go 提交中击败了 69.23% 的用户 内存消耗: 4.6 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 285 / 285 炫耀一下:
  
 
本文由 mdnice 多平台发布
