Day13 :调整数组顺序使奇数位于偶数前面
剑指Offer_编程题——调整数组顺序使奇数位于偶数前面
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间相对位置不变。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
思路一: 根据题意可知,我们不仅要让奇数在偶数的前面,还要考虑奇数和偶数原来的相对位置不变。因此我们首先要寻找第一个奇数,并将其放在0号位置。然后将第一个奇数之前的元素全部往后移一位。依次再第一个奇数之后的元素中寻找奇数,并做移动操作,就可以保证原来的相对顺序。 接下来我们用java实现
public class Solution{
public static void reOrderArray(int [] array){
int j = 0;
int m = 0;
for(int i = 0; i < array.length; i++){
if(array[i] % 2 == 1){
int temp = array[i];
int ti = i;
for(; ti > 0; ti --){
array[ti] = array[ti - 1];
}
array[0] = temp;
j = i;
break;
}
}
for(++j; j < array.length; j++){
if(array[j] % 2 == 1){
int temp = array[j];
int tj = j;
for(; tj > m; tj--){
array[tj] = array[tj - 1];
}
array[++m] = temp;
}
}
}
}
代码效果图如图所示:
在编译器中加入main()函数,进行代码可行性测试,具体测试代码实现入下:
public static void main(String[] args){
int []array = {2, 4, 6, 1, 3, 5, 7};
reOrderArray(array);
for(int i = 0; i < array.length; i++){
System.out.pritnln(array[i] + " ");
}
}
代码测试通过如下图所示:
思路二: 还可以新建两个数组,分别存放奇数和偶数。然后再进行合并。具体用python来进行实现。
class Solution:
def reOrderArray(self, array):
# write code here
a = []
b = []
for i in array:
if i % 2 == 1:
a.append(i)
else:
b.append(i)
a.extend(b)
return a
代码效果图如图所示:
拓展: 如果去掉并保证奇数和奇数,偶数和偶数之间的相对位置不变。还有另一种做法。我们可以用java将其实现,方法比较简单。只需要两个指针分别指向数组的头和尾,依次比较。具体实现步骤如下: 1、如果头指针指向数组位置为奇数,那么就判断尾指针指向的数组位置的奇偶性,如果是奇数,则头指针指向的数组位置为偶数,则尾指针前移一个位置。 2、如果头指针指向的数组位置为偶数,那么就判断尾指针指向的数组位置的奇偶性。如果是奇数,则交换头尾指针指向的数组元素,如果是偶数,则尾指针前移一个位置。 具体用java实现如下:
public class Solution{
public static void main(String[] args){
int []array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
reOrderArray(array);
for(int i = 0; i < array.length; i++){
System.out.println(array[i] + " ");
}
}
public static void reOrderArray(int [] array){
int i = 0;
int j = array.length - 1;
while(i < j){
if (array[i] % 2 == 1){
if(array[j] % 2 == 1){
i++;
}else{
j --;
}
}else{
if(array[j] % 2 ==1){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}else{
j--;
}
}
}
}
}
代码测试如图所示:
总结
本道题主要通过一个数组考察奇偶数的位置,并且特意强调调整位置后,要保证原来的相对位置。这就增加了一定的难度,这就需要寻找第一个奇数并放入数组的开头,然后继续将数组往后移动。然后,如果去掉这个“保持位置不变”的情况,则变得相对简单,只需要让两个指分别指向数组的头和尾,依次比较即可。总之,继续加油,争取早日找到工作,Good Luck!!!
- Python3.6新特性官方文档中文版
- (23) 枚举的本质 / 计算机程序的思维逻辑
- (22) 代码的组织机制 / 计算机程序的思维逻辑
- Python开发微信公众号后台(系列二)
- (21) 内部类的本质 / 计算机程序的思维逻辑
- (20) 为什么要有抽象类? / 计算机程序的思维逻辑
- Python云计算框架:Openstack源码分析之RabbitMQ(一)
- (38) 剖析ArrayList / 计算机程序的思维逻辑
- 破解验证,让爬取更随心所欲!
- Visual Studio Code v0.9.1 发布
- (39) 剖析LinkedList / 计算机程序的思维逻辑
- 我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密
- 看到那个Edward 了吗?对!其实它是个Python库
- (35) 泛型 (上) - 基本概念和原理 / 计算机程序的思维逻辑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL 主从架构原理
- 从后端到前端之Vue(六)表单组件 HTML5原生的表单和表单元素Vue组件的基础知识表单元素组件辅助工具开源
- OpenAI Gym 入门
- 常见编程模式之合并区间
- chmod 777 是开发的常规操作吗?
- 手把手教你进行Anaconda的安装
- 浅析Python基础知识之面向对象
- 手把手教你用Python进行SSH暴力破解
- 一文学会注解的正确使用姿势
- 面试官:请算出走迷宫需要的最少步数
- lua执行redis脚本找不到脚本的问题
- Android |《看完不忘系列》之dagger
- Android | dagger细枝篇
- ES UpdateByQuery Java Api
- [Bazel]repository_rule() vs rule()