每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面

简介: 每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面(一)


难度:中等


描述

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

数据范围

数据范围:0≤n≤5000,数组中每个数的值 0≤val≤10000

要求:时间复杂度 O(n),空间复杂度 O(n)

进阶:时间复杂度 O(n2),空间复杂度 O(1)

举例

image.png

解题思路

首先,如果不考虑奇数和奇数,偶数和偶数的相对位置,那么我们有一种双指针解法来求解,类似于快排,维护两个指针,第一个指针指向数组的第一个数字,第二个指针指向数组的最后一个数字。第一个指针向后移,第二个指针向前移,如果第一个指针指向偶数,第二个指针指向的是奇数,则交换着两个数字,接着继续移动直到两指针相遇。

上面的方法看似不错,但是对本题不适用,因为本题有相对位置不变的要求,直接交换会导致相对位置改变。因此,我们采用下面的思路来解决本题。

本题解法:对数组进行遍历,设置两个指针even和odd,even指向当前第一个偶数,odd从这个偶数之后开始查找,找到第一个奇数,此时为了相对位置不变,不能直接交换even和odd,而是将从even到odd-1的元素都依次向后移一个位置,将odd指向的那个奇数放到even的位置。然后再找下一个偶数,重复这一过程,最终就可以将奇数都放到偶数的前面,并且保证了相对位置的不变。

编程实现(java)


import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    public int[] reOrderArray (int[] array) {
        // write code here
        int i = 0,j = 0;
        int n = array.length;
        while(i
            //找到第一个偶数
            while(i2!=0){
                i++;
            }
            //找到第一个偶数后的第一个奇数
            j= i+1;
            while(j2==0){
                j++;
            }
            //注意判断,防止溢出
            if(j>=n) break;
            //把偶数与奇数之间的所有偶数往后移动,奇数与该偶数位置的元素对调
            //先把偶数后第一个奇数保存下来,因为接下来的移动过程中会替换掉该奇数
            int t = array[j];
            for(int k = j-1;k>= i;k--){
                array[k+1] = array[k];
            }
            //把奇数填到第一个偶数往后移动,所腾出来的位置
            array[i] = t;
            i++;
        }
        return array;
    }
}

结果

image.png

image.png

调整数组顺序使奇数位于偶数前面(二)

难度:简单

描述

输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。

数据范围

数据范围:0≤n≤50000,数组中每个数的值 0≤val≤10000

要求:时间复杂度 O(n),空间复杂度 O(1)

举例

image.png

解题思路

这道题不需要要求相对位置不变,因此我们可以采用位置交换的方法,只要奇数全部换到前面就可以了。

利用左右双指针分别从数组首尾出发向中间走,交换其中的偶数在前奇数在后的情况。

编程实现(java)


import java.util.*;
public class Solution {
    public int[] reOrderArrayTwo (int[] array) {
        //双指针
        int i = 0;
        int j = array.length - 1; 
        //向中间聚合
        while(i < j){ 
            //左右都是奇数,左移右不动
            if(array[i] % 2 == 1 && array[j] % 2 == 1) 
                i++;
            //左奇数右偶数,左右都向中间缩
            else if(array[i] % 2 == 1 && array[j] % 2 == 0){
                i++;
                j--;
            }
            //左偶右奇数
            else if(array[i] % 2 == 0 && array[j] % 2 == 1){
                //交换
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
            //左右都是偶数,只移动右指针
            else 
                j--;
        }
        return array;
    }
}

结果

image.png

image.png



相关文章
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
2642 0
|
数据采集 存储 JavaScript
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
本文介绍了如何使用Python编写网络爬虫程序爬取书旗网上的小说数据,并通过逆向工程对抗网站的反爬机制,最后对采集的数据进行可视化分析。
690 109
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
|
数据采集 大数据
大数据实战项目之电商数仓(二)
大数据实战项目之电商数仓(二)
314 0
|
11月前
EMNLP 2024 Oral | CoBa:均衡多任务收敛之道
我们提出了一种满足了以上两种需求的新的 MTL 方法——CoBa,旨在以最小的计算开销有效控制多任务收敛的平衡。CoBa 利用相对收敛分数(RCS)、绝对收敛分数(ACS)和发散因子(DF),在训练过程中动态地调整任务权重,确保所有任务的验证集损失以均匀的速度朝向收敛推进,同时缓解了个别任务提前发散的问题。本文在四个不同的多任务数据集上进行实验,结果表明,CoBa 不仅促进了任务收敛的平衡,而且与最佳基线方法相比,还使 LLMs 的性能至多提升了 13%。
165 3
|
Web App开发 消息中间件 Prometheus
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(一)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
XML 安全 JavaScript
常见性能测试指标
常见性能测试指标
434 0
|
监控 测试技术 Linux
性能工具之 Apache Bench 入门使用
ab 全称为:apache bench,ab 为小型压力工具,对于在 Linux 中简单压测 HTTP 接口轻巧灵活。
324 1
|
前端开发 JavaScript 编译器
sass 混入 (@mixin 与 @include的使用)
sass 混入 (@mixin 与 @include的使用)
604 0
|
分布式计算 监控 Java
Spark学习---day06、Spark内核(源码提交流程、任务执行)
Spark学习---day06、Spark内核(源码提交流程、任务执行)
213 2
|
Linux 虚拟化
VMWare虚拟机怎么安装Linux 操作系统?
VMWare虚拟机怎么安装Linux 操作系统?
495 0