title: 每日一练(11):调整数组顺序使奇数位于偶数前面
categories:[剑指offer]
tags:[每日一练]
date: 2022/01/24
每日一练(11):调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
方法一:有手就行建立容器,第一次循环放入奇数,第二次循环放入偶数 .
vector方法二:首尾双指针exchange(vector & nums) { vector res; for (int i = 0; i < nums.size(); i++) { if ((nums[i] & 1) != 0) { //nums[i] & 1) != 0 可用 nums[i] % 2 替代 res.push_back(nums[i]); //放入奇数 } } for (int i = 0; i < nums.size(); i++) { if ((nums[i] & 1) != 1) { //nums[i] & 1) != 1 可用 (nums[i] % 2) == 0 替代 res.push_back(nums[i]); //放入偶数 } } return res; }
定义头指针 left ,尾指针 right .left 一直往右移,直到它指向的值为偶数 .right 一直往左移, 直到它指向的值为奇数 .交换 nums[left] 和 nums[right] .重复上述 *** 作,直到 left == right .
vector方法三:快慢双指针exchange(vector & nums) { int left = 0, right = nums.size() - 1; while (left < right) { if ((nums[left] & 1) != 0) { //如果为偶数 left++; continue; } if ((nums[right] & 1) != 1) { //如果为奇数 right--; continue; } swap(nums[left++], nums[right--]); //交换值 } return nums; }
定义快慢双指针 fast 和 slow ,fast 在前, slow 在后 .fast 的作用是向前搜索奇数位置,slow 的作用是指向下一个奇数应当存放的位置 .fast 向前移动,当它搜索到奇数时,将它和 nums[slow ] 交换,此时 slow 向前移动一个位置 .重复上述 *** 作,直到 fast 指向数组末尾 .
vectorexchange(vector & nums) { int slow = 0, fast = 0; while (fast < nums.size()) { if ((nums[fast]) & 1) { //奇数 swap(nums[slow], nums[fast]);//交换 slow++; } fast++; } return nums; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)