整数数组的奇数位于数组的前半部分,偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变

news2024/11/27 4:26:08

请添加图片描述

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

思路1:
类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况。

// 类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况
    public static void reOrderArray1(int[] array){
        int length = array.length;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length-1; j++) {
                if(array[j] % 2 == 0 && array[j+1] % 2 ==1){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }

思路2:
开辟一个与原数组一样大的vector,从头遍历一遍将奇数放在前面,然后再遍历一遍,将偶数接着放在后面。

public static int[] reOrderArray2(int[] array){
        int length = array.length;
        int[] newArray = new int[array.length];
        int j = 0;
        // 先存奇数
        for (int i = 0; i < length; i++) {
           if(array[i] % 2 == 1){
                newArray[j] = array[i];
                j++;
           }
        }

        // 再存偶数
        for (int i = 0; i < length; i++) {
            if(array[i] % 2 == 0){
                newArray[j] = array[i];
                j++;
            }
        }
        return newArray;
    }

思路3:
先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count,一个从数组尾部遍历到count。

从前向后找到一个偶数的下标,从后向前找到一个奇数的下标,然后交换对应的值。直到遍历完整个数组。时间复杂度为O(n),空间复杂度为O(1)

// 先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count,一个从数组尾部遍历到count。
    // 从前向后找到一个偶数的下标,从后向前找到一个奇数的下标,然后交换对应的值。
    // 直到遍历完整个数组。时间复杂度为O(n),空间复杂度为O(1)
    private static int[] reOrderArray3(int[] arr) {
        // 头部指针
        int front =0;
        // 尾部指针
        int end = arr.length-1;
        while(front < end){
            while (front < arr.length && arr[front] % 2 == 1){
                // 从前向后找偶数,如果找到(即arr[front] % 2 == 0),则front位置不移动
                front ++;
            }

            while (end > 0 && arr[end] % 2 == 0){
                // 从后往前找奇数,如果找到(即arr[end] % 2 == 1),则end位置不移动
                end --;
            }

            if (front < end){
                // 将前面的偶数与后面奇数交换位置
                int temp = arr[front];
                arr[front] = arr[end];
                arr[end] = temp;
            }
        }
        return arr;
    }

整体代码

import java.util.Scanner;

public class Test9 {
    // 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,
    // 并保证奇数和奇数,偶数和偶数之间的相对位置不变。
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 英文逗号分割数字比如 3,2,1,5,6,4
        String temp1 = sc.nextLine();
        String[] s = temp1.split(",");
        int[] array = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            array[i] = Integer.parseInt(s[i]);
        }

        /*
        reOrderArray1(array);
        for (int i = 0; i <array.length ; i++) {
            System.out.print(array[i]+" ");
        }
        */

        /*
        int[] finalArray = reOrderArray2(array);
        for (int i = 0; i <finalArray.length ; i++) {
            System.out.print(finalArray[i]+" ");
        }
        */

        int[] finalArray = reOrderArray3(array);
        for (int i = 0; i <finalArray.length ; i++) {
            System.out.print(finalArray[i]+" ");
        }
    }

    // 类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况
    public static void reOrderArray1(int[] array){
        int length = array.length;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length-1; j++) {
                if(array[j] % 2 == 0 && array[j+1] % 2 ==1){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }

    // 开辟一个与原数组一样大的vector,从头遍历一遍将奇数放在前面,然后再遍历一遍,将偶数接着放在后面
    public static int[] reOrderArray2(int[] array){
        int length = array.length;
        int[] newArray = new int[array.length];
        int j = 0;
        // 先存奇数
        for (int i = 0; i < length; i++) {
           if(array[i] % 2 == 1){
                newArray[j] = array[i];
                j++;
           }
        }

        // 再存偶数
        for (int i = 0; i < length; i++) {
            if(array[i] % 2 == 0){
                newArray[j] = array[i];
                j++;
            }
        }
        return newArray;
    }

    // 先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count,一个从数组尾部遍历到count。
    // 从前向后找到一个偶数的下标,从后向前找到一个奇数的下标,然后交换对应的值。
    // 直到遍历完整个数组。时间复杂度为O(n),空间复杂度为O(1)
    private static int[] reOrderArray3(int[] arr) {
        // 头部指针
        int front =0;
        // 尾部指针
        int end = arr.length-1;
        while(front < end){
            while (front < arr.length && arr[front] % 2 == 1){
                // 从前向后找偶数,如果找到(即arr[front] % 2 == 0),则front位置不移动
                front ++;
            }

            while (end > 0 && arr[end] % 2 == 0){
                // 从后往前找奇数,如果找到(即arr[end] % 2 == 1),则end位置不移动
                end --;
            }

            if (front < end){
                // 将前面的偶数与后面奇数交换位置
                int temp = arr[front];
                arr[front] = arr[end];
                arr[end] = temp;
            }
        }
        return arr;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一.CreateFileMapping实现的共享内存及用法

共享内存概念 1.在32位的Windows系统中&#xff0c;每一个进程都有权访问他自己的4GB&#xff08;2324294967296&#xff09;平面地址空间&#xff0c;没有段&#xff0c;没有选择符&#xff0c;没有near和far指针&#xff0c;没有near和far函数调用&#xff0c;也没有内存模式…

CUDA并行编程

gpu 图形处理专用单元 cpu是主机单元 gpu显卡处理器 专门执行复杂数学和几何计算 不同表面有不同光纤效果 必须达到快速计算能力 gpu专门设计为大规模并行吞吐处理设计 用于加速图形显示 &#xff0c; 吞吐量高 峰值计算能力 4612 GFLOP/S 一秒钟可以计算4612G次浮点数计算…

SQL注入实操

文章目录 一、sqli-lab靶场搭建二、通关笔记1.Less-1a.单引号‘b.updatexmlc.concatd.unione.information_schemaf.GROUP_CONCATg.select 1,2 2.Less-2 一、sqli-lab靶场搭建 下载路径&#xff1a;https://www.hibugs.net/hi-resource/sqli-labs-master.zip 下载后解压复制到w…

腾讯数据中台项目集管理实战分享︱腾讯高级项目经理张嵎桐

腾讯PCG大数据平台部高级项目经理张嵎桐先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;腾讯数据中台项目集管理实战分享。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 在“IT时代”向“…

9、加载cesium世界地形

本节演示使用CCsium库加载cesium的世界地形&#xff0c;使用第四节单击事件的例子&#xff0c;修改点击事件添加地形。 1、ceisum显示地形需要引入CesiumTerrainProvider和CreateWorldTerrain类。与ceisum类似&#xff0c;修改鼠标点击事件&#xff0c;创建地形并添加到ceisum…

Apache Doris (二十八):Doris 数据导入(六)Spark Load 1- 原理及配置

目录 1. 基本原理 2. Spark集群搭建 2.1 Spark Standalone 集群搭建 2.2 Spark On Yarn 配置 3. Doris配置Spark与Yarn 3.1 Doris配置Spark 3.2 Doris配置Yarn 进入正文之前&#xff0c;欢迎订阅专题、对博文点赞、评论、收藏&#xff0c;关注IT贫道&#xff0c;获取高质…

leetcode:定长字串中元音的最大数目

定长字串中元音的最大数目 medium 给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 示例 1&#xff1a; 输入&#xff1a;s "abciiidef", k 3 输出…

KBLAutoSwitch偶尔无法自动切换输入法的问题

KBLAutoSwitch&#xff08;https://github.com/flyinclouds/KBLAutoSwitch&#xff09;是一款中英文输入法自动切换软件&#xff0c;但是在使用过程中偶尔会出现无法自动切换成自己想要的输入法的问题&#xff0c;比如我将cmd窗口设为自动切换英文输入法&#xff0c;但是在使用…

计算机组成原理 期末复习

在我的博客查看&#xff1a;https://chenhaotian.top/study/computer-composition-principles-final-review/ 如果遇到 外链图片转存失败 &#xff0c;直接打开链接查看图片 计算机组成原理 期末复习 第 1 章 计算机系统概论 1.1 计算机的诞生和发展 冯诺依曼体系 1.2 计算…

LLaMA以及其扩展模型总结(一)

自从ChatGPT发布以来&#xff0c;人们看到了AGI时代的曙光&#xff0c;但是由于ChatGPT是闭源的&#xff0c;只能在官网体验和使用API进行访问&#xff0c;据OpenAI CEO说是出于AGI的安全性考虑&#xff0c;这样大大限制了很多研究人员和机构对于AGI的研究进展。Meta公司反其道…

在线转换视频格式到mp4怎么换?分享两个方法!

在日常生活和工作中&#xff0c;我们常常需要将视频文件转换为MP4格式以便于在各种设备上播放和共享。本文将介绍两种快速转换视频格式为MP4的方法&#xff0c;一种是使用记灵在线工具&#xff0c;另一种是使用一个在线转换工具。 方法一&#xff1a;记灵在线工具 记灵是一款…

LED驱动(原始架构)——STM32MP157

文章目录 硬件知识 LED 原理GPIO 引脚操作方法GPIO 模块一般结构GPIO 寄存器的一般操作 STM32MP157的GPIO操作方法先使能PLL4MPU、MCU共享GPIO模块1. 在MPU上使能某个GPIO模块2. 在MCU上使能某个GPIO模块 GPIO模块设置引脚工作模式&#xff1a;GPIO模式对于输出引脚&#xff1a…

模块化+命名空间

1.目的&#xff1a;为了让代码更好维护&#xff0c;让多种数据分类更加明确 2.修改src/store/index.js为了解决不同模块命名冲突的问题&#xff0c;将不同模块的namespaced:true&#xff0c;之后在不同页面中引入getter actions mutations state&#xff0c;需要加上所属的模块…

ADC基础进阶

ADC 啊.... 拿华大的来举例吧... 最少要知道了两个电路。 1. VERF 华大HC32F60的ADC以VREF为内部基准电压&#xff0c;如果VREFH管教悬空&#xff0c;那么实际其基准电压应该是MCU_3.3V&#xff0c;如果VREFH额外搭电路提供电压&#xff0c;应该是以其实际提供的电压为准&am…

Uber是如何解决数据一致性问题的呢?

Uber的请求流程非常复杂&#xff0c;如上图所示&#xff0c;他们使用Spanner来存储大量数据。Spanner是一个全面托管的、关键的关系型数据库服务&#xff0c;可以在全球范围内提供事务一致性和高可用性的自动同步复制。 但是&#xff0c;当扩展到数百万并发请求时&#xff0c;使…

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B&#xff1a;美国纽约公共自行车使用量预测分析 问题一 1 题目 Citi Bike是纽约市在2013年启动的一项自行车共享出行计划&#xff0c;由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿&#xff0c;布鲁克…

PID算法:标准PID算法的一些改进措施

前面的几篇文章分别分享了PID算法的原理、增量式和位置式PID算法的区别、以及过程控制中一些重要的指标&#xff0c;感兴趣的朋友可以回看之前的文章或者自行查阅资料。 在实际项目中&#xff0c;使用数字PID算法对系统的被控量进行控制的时候&#xff0c;有时候并不是仅仅的使…

面试之可重复读是否可以解决幻读

可重复读&#xff08;repeatable read&#xff09;定义:一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据时是一致的。 不过理论上 是会出现幻读的&#xff0c;简单的来说幻读指的是当用户读取某一范围的数据行时&#xff0c;另外一个事务又在该范围…

一个PDF怎么拆分成几个?这几个方法轻松拆分PDF!

在现代生活与工作的环境中&#xff0c;我们常常需要以高效的方式处理包含大量信息的PDF文件。在这种情况下&#xff0c;拆分这些文件成为一种理想的解决方案&#xff0c;以便更精准地管理和阅读这些信息。接下来&#xff0c;我们将深入探讨几种实用的PDF拆分技巧。 一、直观的…

postman-循环调用测试接口

此篇文章产生的背景是想针对接口做流控验证&#xff0c;检查流控是否奏效&#xff0c;便发现postman也能一次操作来循环调用接口&#xff0c;减少了一些开发测试工作&#xff0c;下面就看一下操作流程 目录 前置查看postman版本我的接口数据 具体操作步骤新建接口集选择接口集进…