【剑指offer】面试题21-调整数组顺序使奇数位于偶数前面

题目

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

1.思路

思路1: 插入排序 ---- 时间O(n²),空间O(1)
双重循环,遇到偶数在前奇数在后的相邻两个元素就马上进行交换;
这样能保证交换后奇数与奇数之间、偶数与偶数之间相对前后位置不变,即保证排序的稳定性。
思路2: 牺牲空间换时间 ---- 时间O(n),空间O(n)
新建两个数组,分别用来存放原数组中的奇数、偶数;
然后再将这两个数组的元素重新赋值给原数组,即筛选–分类–覆盖。
从原数组中筛选奇、偶数;分类到奇数数组和偶数数组中分别存放;依次将奇数数组元素、偶数数组元素重新写回原数组去覆盖原数组的值。

2.代码(Java实现)

// 思路1.插入排序排序
class Solution {
	public void reOrderArray(int [] array) {
		// 1.插入排序排序
		for(int i = 0;i < array.length - 1; i ++){
            for(int j = 0; j < array.length-1-i; j ++){
                if(array[j] % 2 == 0 && array[j + 1] % 2 != 0){
                    int t = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = t;
                }
            }
        }
    }
}
class Solution {
	public void reOrderArray(int [] array) {
		// 思路2. 空间换时间
		int len1 = 0,len2 = 0;
		for (int i = 0; i < array.length ; i ++){
            if (array[i] % 2 != 0){
                len1 ++;
            }
            if (array[i] % 2 == 0){
                len2 ++;
            }
        }
		int []odd = new int[len1];
        int []even = new int[len2];
        int j = 0,k = 0;
        for (int i = 0; i < array.length ; i ++){
            if (array[i] % 2 != 0){
                odd[j++] = array[i];
            }
            if (array[i] % 2 == 0){
                even[k++] = array[i];
            }
        }
        for (int i = 0; i < len1; i ++){
             array[i] = odd[i] ;
        }
        for (int i = 0; i < len2; i ++){
             array[len1 + i] = even[i] ;
        }
    }
}

开始解题的时候没有考虑到保证稳定性,使用了类似于简单选择排序的方法,如果不要求稳定性,那么这个方法还是不错的。时间复杂度O(n),空间复杂度O(1)

思路:
(1)前后各设一个游标,前为i,后为j;
(2)当array[i]是奇数,i后移,当array[j]是偶数,j前移,当array[i]是偶数 且array[j]是奇数,两者互换;
(3)i <= j为限定条件。
代码

public class Solution {
    public void reOrderArray(int [] array) {
        for (int i = 0, j = array.length - 1; i <= j ; i ++, j --) {
            if(array[i] % 2 != 0) {
                i ++;
            }
            if(array[j] % 2 == 0) {
                j --;
            }
            if (array[i] % 2 == 0 && array[j] % 2 != 0) {
                int temp = array[i];
                array[i] = array[j]; 
                array[j] = array[i]; 
            }
        }
    }
}
python大作业 一、Turtle创意大PK 自拟题目,完成一个利用Python程序的创意绘图,采用turtle库绘图为主,不少于50行代码,可选采用其他库。 (滑稽绘制) 二、程序练习 2.1 问题描述(10分) 人们常常提到"一万小时定律",就是不管你做什么事情,只要坚持一万小时,应该都可以成为该领域的专家。那么,10000小时是多少年多少天呢? 2.2 问题描述(10分)0380031003800341590145037657 编写计算从n到m和的函数‬,函数名为sum(n,m)‬,函数返回值为n到m所有数据的和‬,使用该函数计算输入数据x,y之间所有数据的和。 2.3 问题描述(15分) 编写函数judgeTri(a,b,c),判断以参数a,b,c的值为边长能否构成三角形并判断三角形的形状;若是锐角三角形,返回R;若是直角三角形,返回Z;若是钝角三角形,返回D;若三边长不能构成三角形,返回ERROR。 2.4 问题描述(15分) 用户输入一个字符串,分别统计其中小写字母、大写字母、数字、空格和其他字符的个数,并在一行内输出小写字母、大写字母、数字、空格和其他字符的个数。 2.5 问题描述(20分) 程序的功能: (1) 使用随机库功能,生成一个包含10个不重复且小于200的正整数列表ls1,输出ls1。‬ (2) 使用列表排序方法,对ls1奇数偶数在后,并且奇数之间相对顺序不变偶数之间相对顺序不变进行排序,再输出ls1。‬ (3) 使用列表排序方法,对ls1按元素字符长度降序进行排序,输出ls1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值