剑指offer代码解析——面试题14调整数组顺序使奇数在偶数之前
时间:2022-05-03
本文章向大家介绍剑指offer代码解析——面试题14调整数组顺序使奇数在偶数之前,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本题详细解析都已在代码中注释了:
/**
* 题目:输入一个数组,要求将奇数放在数组的前半段,偶数放在数组的后半段
* @author 大闲人柴毛毛
*/
public class Reorder {
/**
* 分析:本题只要求前半段为奇数,后半段为偶数,没有要求有序,
* 因此可以采用快速排序中一趟排序的思想:
* 使用两个指针i、j,i指向头、j指向尾,分别向后、向前扫描;
* 若i遇到偶数则停下,j遇到奇数则停下,交换这两个数,
* 然后继续重复上述操作,直到i、j相遇为止。代码如下:
* PS:快速排序算法请看我的博客《剑指 offer——快速排序》
*/
public static boolean reorder(int[] a){
//若数组为空
if(a==null || a.length==0){
System.out.println("数组为空!");
return false;
}
//若数组只有一个元素,那不做任何操作
if(a.length==1){
System.out.println("数组长度为1,无需排序!");
return true;
}
//若数组长度超过2,则进行排序
int i=0,j=a.length-1;
while(i<j){
//i从头向后扫描,若当前元素为奇数,则继续往后扫描,若为偶数,i停止扫描。
while(a[i]%2==1)
i++;
//j从后向前扫描,若当前元素为偶数,则继续往前扫描,若为奇数,j停止扫描。
while(a[j]%2==0)
j--;
//当i、j都停止时,如果i和j还没有相遇,就交换这两个数
if(i<j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
return true;
}
/**
* 上述代码运行过后会出现死循环!
* 当数组全为奇数时,i无限向后寻找,因此出现死循环。
* 因此,在i向后、j向前的循环中应多加一个判断:若i搜索到末尾,则停止、若j搜索到开头,则停止。
* 修改后的代码如下:
*/
public static boolean reorder_modify(int[] a){
//若数组为空
if(a==null || a.length==0){
System.out.println("数组为空!");
return false;
}
//若数组只有一个元素,那不做任何操作
if(a.length==1){
System.out.println("数组长度为1,无需排序!");
return true;
}
//若数组长度超过2,则进行排序
int i=0,j=a.length-1;
while(i<j){
//i从头向后扫描,若当前元素为奇数,则继续往后扫描,若为偶数,i停止扫描。
while(i<a.length-1 && a[i]%2==1)
i++;
//j从后向前扫描,若当前元素为偶数,则继续往前扫描,若为奇数,j停止扫描。
while(j>0 && a[j]%2==0)
j--;
//当i、j都停止时,如果i和j还没有相遇,就交换这两个数
if(i<j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
return true;
}
}
- 《大话数据结构》 查找 以及一个简单的哈希表例子
- 《大话数据结构》树以及赫夫曼编码的例子
- 《大话数据结构》一些基础知识
- Golang RPC 之 gRPC
- 厚土Go学习笔记 | 06. 变量
- 厚土Go学习笔记 | 05. 函数
- Implement Domain Object in Golang
- 厚土Go学习笔记 | 04. 导入和导出的不同 用math.Pi来举例
- 厚土Go学习笔记 | 03. 数学运算的随机数
- Nodejs学习笔记(十一)--- 数据采集器示例(request和cheerio)
- 厚土Go学习笔记 | 02. 打印当前时间time.Now()时不我待
- 厚土Go学习笔记 | 01. Hello World开篇
- Golang精编100题
- IntelliJ idea配置Go开发环境
- 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 数组属性和方法
- ES6中的箭头函数=>
- 22 个让 React 开发更高效更有趣的工具
- JavaScript中==和===的区别
- 解决:打包SpringBoot项目成jar包后,其他的项目无法引入jar包中的对象
- 【分享】MPSoC R5引导4个A53和两个R5的应用程序的例子
- 【分享】MPSoC交叉编译例子
- JSON.stringify() 的 5 个秘密特性
- Kyverno - Kubernetes 原生策略管理引擎
- 你不知道的 Vue 单元测试(6000字实战单元测试)
- Linux系统异常排查实践与总结
- 它会不会成为OCR领域霸主?经过一个月的分析,我得出了这些结论
- 【一天一大 lee】二叉搜索树中的插入操作 (难度:中等) - Day20200930
- docker 由于iptables导致无法正常启动问题临时解决方案
- 【一天一大 lee】反转字符串 (难度:简单) - Day20201008
- 【一天一大 lee】四数之和 (难度:中等) - Day20201005