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

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

请添加图片描述

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

思路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

相关文章

一文详解如何在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

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图