【剑指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】调整数组顺序使奇数位于偶数前面
		
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
 
随机推荐
- ADAS虚拟车道边界生成
			
ADAS虚拟车道边界生成 Virtual Lane Boundary Generation for Human-Compatible Autonomous Driving: A Tight Coupl ...
 - HiCar基本功能介绍
			
HiCar基本功能介绍 基本概述 一方面,基于操作系统超强的分布式能力,HUAWEI HiCar通过手机和汽车之间的连接,基于三层标准与能力,构建手机和汽车互助资源池,把手机的服务生态延伸到车内,实现 ...
 - 【VBA】类型转换
			
每个函数都可以强制将一个表达式转换成某种特定数据类型. 语法 CBool(expression) CByte(expression) CCur(expression) CDate(expression ...
 - 如何设置Python环境变量
			
大家好,我是Yivies.相信很多python的初学者们在进行一顿下一步下一步的安装之后,在windows command命令行输入python的时候会出现这样的情况: 可我们希望它是这样子的: 其实 ...
 - vue调用子组件方法时,参数传不过去
			
有可能是因为子组件方法用了 async await 子组件去掉async就好了
 - Vue(8)列表渲染v-for
			
循环 在模板中可以用v-for指令来循环数组,对象等. 循环数组 我们可以用 v-for 指令基于一个数组来渲染一个列表.v-for 指令需要使用 item in items形式的特殊语法,其中 it ...
 - [HTML]图像标签<img>的用法、属性及路径问题
			
图像标签:<img> 用法:<img src = "图像地址"> 图像标签的属性 属性 说明 src 指明图像的地址(分为相对路径和绝对路径两 ...
 - centos7 安装最新的 wiki confluence
			
41.1 下载confluence Confluence是一个企业级的Wiki,可用于企业.部门.团队内部进行信息共享和协同编辑. 下载地址: https://www.atlassian.com/so ...
 - 20、nginx之ngx_http_upstream_module模块
			
nginx的ngx_http_upstream_module模块是用于nginx反向代理的,默认在安装nginx时已经被安装,ngx_http_upstream_module模块 的内容应放于 ngi ...
 - 4、git和gitlab的配置(2)
			
4.10.使用 gitlib 模拟开发流程: 1.项目经理指定开发计划: project01 需求 开发者 完成日期 v1.0 首页 dev01 4.28 支付 dev02 4.30 2.rpm(项目 ...