剑指offer面试题[14]-调整数组顺序使奇数位于偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析:
这个题目的最早版本应该是输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。(没有要求相对位置不变)
早期版本思路一:
可以定义一个与原数组大小一样的新数组,遍历原数组,将奇数按顺序从前往后存取到新数组中,若遇到偶数,则从新数组的最后一个位置开始存,遇到第二个偶数,存到新数组倒数第二个位置............依次进行。这种方法空间复杂度为O(n),即需要额外开辟一个新的空间,而且只能保证奇数的相对位置不变,偶数的相对为位置被改变了。因此这种做法是不稳定的。
早期版本思路二:
可以定义两个指针,第一个指针从前往后遍历直到遇见第一个偶数,第二个指针从后往前遍历,直到遇见第一个奇数,此时交换两个指针指向数组位置的值,依次移动两个指针,直到两个指针的位置相差1停止。这种做法也只能保证奇数放在前半部分,偶数放在后半部分。并不能保证相对位置不变。
若要保证相对位置不变,思路如下:
从数组第一个位置往后依次遍历,遇到第一个偶数暂停,此时下标位置记为i,然后从位置i+1开始,依次往后遍历,直到遇见第一个奇数,此时位置为j。用一个临时变量temp将第j个位置的值存起来,然后将数组第i个位置到第j-1个位置依次往后挪动一个位置,最后将temp变量的值,也就是挪动前j位置的值赋给第i个位置,然后执行i++,依次进行下去。。。
以1,2,3,4,5,6,7为例分析。
1 2 3 4 5 6 7
第一次i和j指向: i j
挪动: 1 3 2 4 5 6 7
执行i++ : 1 3 2 4 5 6 7
i
第二次i和j指向: 1 3 2 4 5 6 7
i j
挪动:
1 3 5 2 4 6 7
依次执行.........................
参考程序:
class Solution {
public:
void reOrderArray(vector<int> &array) {
int n=array.size( );
if(n==0||n==1)
return;
for(int i=0;i<n;i++)
{
if(array[i]%2==0) //一定注意是%(取余运算),而不是/(取整)。
{
for(int j=i+1;j<n;j++) // 第二处for循环
{
if(array[j]%2!=0)
{
int temp=array[j];
for(int k=j;k>i;k--)
{
array[k]=array[k-1];
}
array[i]=temp;
}
if(array[i]%2!=0) //如果j找到了第一个奇数就执行break,否则继续找,因为若没有找到i后面第一个奇数,array[i]的值是偶数,
{ //并没有被改变,当然if判断里面也可以是if(array[j]%2==0) 等
break; //这里break的目的是为了j找到第一个奇数后,挪动了相应的元素后退出第二处for循环,而不是依次执行下去
} //如果是直接是break没有if判断,就会有问题,因为会导致j第一次没有找到奇数就退出了
}
}
}
}
};
剑指offer面试题[14]-调整数组顺序使奇数位于偶数前面相关推荐
- 剑指Offer - 面试题21. 调整数组顺序使奇数位于偶数前面(双指针,原地算法)
1. 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4 ...
- 剑指offer面试题21. 调整数组顺序使奇数位于偶数前面(双指针)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路 详见链接 代码 class Solution:def exchan ...
- 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面:遍历交换 特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用 ...
- 【剑指offer】21、调整数组顺序使奇数在偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 思路一 从前往后扫描数组,遇到一个偶数就把它放到数组末尾,并且把之后 ...
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...
- 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面
题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...
- 14 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分 C++: 1 void reOrderArray(vector<int ...
- 面试 6:调整数组顺序使奇数位于偶数前面
今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所 ...
- 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面
剑指offer--面试题14:调整数组顺序使奇数位于偶数前面 Solution1: 顺序交换,比较好的算法!!! class Solution { public:void reOrderArray(v ...
最新文章
- 算法笔记_157:算法提高 c++_ch02_01(Java)
- mysql错误1451_mysql错误代号-J(1451~1494)
- 谷歌新作gVisor:VM容器融合技术已经到来
- html对字符串判空,使用XslCompiledTransform获取html作为字符串。结果为空
- 汉字笔画数据_把所有汉字叠起来会怎样?
- 全排列问题(洛谷P1706题题解,Java语言描述)
- OpenCV3学习(1)——基本数据类型
- 数据库的持续集成和版本控制[转自INFOQ]
- RecognizerIntent(语音识别)
- codeforces Free Cash
- 火狐浏览器 附件组件 Xpath 安装
- SARscape手动下载30mDEM(SRTM1 V3)切片数据-[EC: 40008]
- Python tkinter 设置主题
- 抛物线交点式公式_初一年级二次函数公式:顶点式、交点式、两根式
- criterion of IMAP4.search 限制规范
- EKL日志分析平台-kibana数据可视化
- Pytorch迁移学习加载部分预训练权重
- win10+TeamVIew+花生壳 0元实现 远程开机教程附带截图超详细 已实践成功
- 阿里云搭建自己的anki服务器
- USACO_Wormholes