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

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

请添加图片描述

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

思路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中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim