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

本文主要是介绍整数数组的奇数位于数组的前半部分,偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述

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

思路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,4String 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.chinasem.cn/article/682716

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c