【剑指offer】77.调整数组顺序使奇数位于偶数前面

77.调整数组顺序使奇数位于偶数前面

知识点:数组;双指针;

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
例如:

输入:1,2,3,4; 输出:1,3,2,4; 输入:2,4,6,5,7; 输出:5,7,2,4,6;
假设这个题我们没有最后一句话,也就是不用保持相对位置,只让奇数在前,偶数在后就可以了;

解法一:

遍历数组,遇到奇数的时候就把它前面的都向后移一位,然后让这个奇数位于最前面;

class Solution { public int[] exchange(int[] nums) { for(int i = 0; i < nums.length; i++){ if(nums[i] % 2 != 0){ int temp = nums[i]; for(int j = i; j > 0; j--){ nums[j] = nums[j-1]; } nums[0] = temp; } } return nums; } }

时间复杂度O(n^2);

解法二:快速排序的思想

试想一下快速排序,就是让小的在前,大的在后,这道题就是奇的在前,偶的在后,有点像啊。怎么做呢,前后各定义一个指针,前面的开始往后走,碰到偶数停下来,后面的往前走,碰到奇数停下来,然后把他俩换一下,当两个指针碰面了,那就结束了;

class Solution { public int[] exchange(int[] nums) { int left = 0; int right = nums.length - 1; while(left < right){ if(nums[left] % 2 != 0){ left++; continue; //每次移动完后就出去看看俩人碰面没; } if(nums[right] % 2 == 0){ right--; continue; } int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } return nums; } }

时间复杂度O(NlogN);
好了,前面是不用固定相对位置的时候我们的做法,现在不仅要让奇数在前,偶数在后,还要让他们原来的相对位置不能发生变化;

解法一:

从头到尾遍历一遍数组,然后找到奇数,把奇数依次存到我们新建的一个数组里,然后再从头到尾遍历一遍数组,找到偶数,把偶数再存进去;

import java.util.*; public class Solution { public int[] reOrderArray (int[] array) { int[] ans = new int[array.length]; int index = 0; for(int i = 0; i < array.length; i++){ if(array[i] % 2 == 1){ ans[index] = array[i]; index++; } } for(int i = 0; i < array.length; i++){ if(array[i] % 2 == 0){ ans[index] = array[i]; index++; } } return ans; } }

这种方法新建了一个数组,时间复杂度O(n);但是空间复杂度O(n);

解法二:冒泡排序思想

上面不保持相对位置的时候我们用了快速排序的思想,现在想想冒泡排序,其有一个很大的特点:冒泡具有稳定性,前后位置不会发生变化;
遍历整个数组,如果出现前偶后奇的情况,那就把他们交换位置,这样一轮下来,原始数组中最右边的那个偶数一定排到了最后一个。然后再接着来一轮....

public class Solution { public int[] reOrderArray (int[] array) { for(int i = 0; i < array.length; i++){ for(int j = 0; j < array.length - 1 - i; j++){ if(array[j] % 2 == 0 && array[j+1] % 2 == 1){ int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } return array; } }

时间复杂度O(n^2),其实就是用时间换空间;


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/14753314.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【剑指offer】77.调整数组顺序使奇数位于偶数前面』
点击右上角即可分享
微信分享提示