题目描述

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

分析:

这个题目的最早版本应该是输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。(没有要求相对位置不变)

早期版本思路一:

可以定义一个与原数组大小一样的新数组,遍历原数组,将奇数按顺序从前往后存取到新数组中,若遇到偶数,则从新数组的最后一个位置开始存,遇到第二个偶数,存到新数组倒数第二个位置............依次进行。这种方法空间复杂度为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]-调整数组顺序使奇数位于偶数前面相关推荐

  1. 剑指Offer - 面试题21. 调整数组顺序使奇数位于偶数前面(双指针,原地算法)

    1. 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4 ...

  2. 剑指offer面试题21. 调整数组顺序使奇数位于偶数前面(双指针)

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路 详见链接 代码 class Solution:def exchan ...

  3. 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面

    调整数组顺序使奇数位于偶数前面:遍历交换 特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用 ...

  4. 【剑指offer】21、调整数组顺序使奇数在偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 思路一 从前往后扫描数组,遇到一个偶数就把它放到数组末尾,并且把之后 ...

  5. java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面

    LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...

  6. 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面

    题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...

  7. 14 调整数组顺序使奇数位于偶数前面

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分 C++: 1 void reOrderArray(vector<int ...

  8. 面试 6:调整数组顺序使奇数位于偶数前面

    今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所 ...

  9. 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面

    剑指offer--面试题14:调整数组顺序使奇数位于偶数前面 Solution1: 顺序交换,比较好的算法!!! class Solution { public:void reOrderArray(v ...

最新文章

  1. 算法笔记_157:算法提高 c++_ch02_01(Java)
  2. mysql错误1451_mysql错误代号-J(1451~1494)
  3. 谷歌新作gVisor:VM容器融合技术已经到来
  4. html对字符串判空,使用XslCompiledTransform获取html作为字符串。结果为空
  5. 汉字笔画数据_把所有汉字叠起来会怎样?
  6. 全排列问题(洛谷P1706题题解,Java语言描述)
  7. OpenCV3学习(1)——基本数据类型
  8. 数据库的持续集成和版本控制[转自INFOQ]
  9. RecognizerIntent(语音识别)
  10. codeforces Free Cash
  11. 火狐浏览器 附件组件 Xpath 安装
  12. SARscape手动下载30mDEM(SRTM1 V3)切片数据-[EC: 40008]
  13. Python tkinter 设置主题
  14. 抛物线交点式公式_初一年级二次函数公式:顶点式、交点式、两根式
  15. criterion of IMAP4.search 限制规范
  16. EKL日志分析平台-kibana数据可视化
  17. Pytorch迁移学习加载部分预训练权重
  18. win10+TeamVIew+花生壳 0元实现 远程开机教程附带截图超详细 已实践成功
  19. 阿里云搭建自己的anki服务器
  20. USACO_Wormholes

热门文章

  1. left join on、where后面的条件的区别
  2. 不同的载体 不同的商业模式
  3. 1078. Bigram 分词
  4. linux ls 参数列表过长,ls提示参数列表过长解决办法
  5. php 对象数组的使用方法,php数组与对象的操作方法
  6. 吴恩达都在做的AI农业到底有什么魔力?
  7. 架构即未来 - 组织的设置 读书笔记
  8. linux配置路径PATH问题
  9. UVA445 Marvelous Mazes
  10. zabbix-自定义键值监控网卡IN、OUT流量