【剑指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),其实就是用时间换空间;
【剑指offer】77.调整数组顺序使奇数位于偶数前面的更多相关文章
- 剑指offer:调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...
- 剑指Offer:调整数组顺序使奇数位于偶数前面【21】
剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)
[牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...
- 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...
- Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面
该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...
- 剑指Offer 13. 调整数组顺序使奇数位于偶数前面 (数组)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 题目地址 https ...
- 【剑指offer】调整数组顺序使奇数位于偶数前面
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
随机推荐
- 腾讯 angel 3.0:高效处理模型
腾讯 angel 3.0:高效处理模型 紧跟华为宣布新的 AI 框架开源的消息,腾讯又带来了全新的全栈机器学习平台 angel3.0.新版本功能特性覆盖了机器学习的各个阶段,包括:特征工程.模型训练. ...
- 对端边缘云网络计算模式:透明计算、移动边缘计算、雾计算和Cloudlet
对端边缘云网络计算模式:透明计算.移动边缘计算.雾计算和Cloudlet 概要 将数据发送到云端进行分析是过去几十年的一个突出趋势,推动了云计算成为主流计算范式.然而,物联网时代设备数量和数据流量的急 ...
- GVS灵动系列家族上新 | 稳住,我们能“银”
用天赐的色库 给生活增加些艺术的气息 生活本应多点探索的乐趣 今天 GVS灵动系列家族流光银(白玻璃) 全新上线 用灵感朝圣自然之道 邂逅另一种柔性美学 与早前的经典黑.星耀灰 和而不同,美美与共 携 ...
- Ucore lab1实验报告
练习一 Makefile 1.1 OS镜像文件ucore.img 是如何一步步生成的? + cc kern/init/init.c + cc kern/libs/readline.c + cc ker ...
- 如何打造高性能的 Go 缓存库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/531 文中代码位置: https://github.com/devY ...
- 徒手用 Go 写个 Redis 服务器(Godis)
作者:HDT3213 今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器.支持: 5 种数据结构(string.list.hash.set.sortedset) 自动 ...
- 这应该是把Java内存区域讲的最清楚的一篇文章
基本问题: 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题: ...
- 《手把手教你》系列基础篇之(二)-java+ selenium自动化测试-环境搭建(下)基于Maven(详细教程)
1.简介 Apache Maven是一个软件项目管理和综合工具.基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件.由于现在企业和公司中Java的大部分项目都是基 ...
- 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)
LCD1602可以说是大多数单片机工程师了解液晶显示的入门级模组,其显示原理与其它很多显示模组也是相似的,今天我们就来详细讨论一下它的指令集.所谓模组的指令集,本质上是该模组使用的控制芯片的指令集,本 ...
- js笔记9
1.面向对象 js一开始就是写网页特效,面向过程的,作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能很差,所以作者就受到了java和c语言的影响,往面向对象靠齐.js天生有一个Ob ...