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

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

请添加图片描述

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

思路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.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2