题目:

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

如果去掉约束条件:并保证奇数和奇数,偶数和偶数之间的相对位置不变?

思路:

如果要保证奇数和奇数,偶数和偶数之间的相对位置不变,那么需要开辟新的空间来保存奇数和偶数,方法有两种:

1、开辟一个新数组,遍历第一遍原数组,将奇数依次写入新数组,遍历第二遍原数组,将偶数依次写入新数组,返回新数组;

2、开辟两个数组,遍历一遍原数组,分别将奇数和偶数存入两个新数组,再将奇数数组和偶数数组分别写入原数组,返回原数组;

如果无需保证奇数和奇数,偶数和偶数之间的相对位置不变,那么可以通过前后遍历,奇偶对换的方法来实现:

维护两个指针,分别指向数组的首尾,然后一个向后一个向前,在两个指针相遇之前,如果第一个指针指向偶数,而第二个指针指向奇数,那么就交换这两个数。(无需开辟新空间)

类似题目:

  • 将题目改成将数组分成两部分,所有负数在非负数前面;
  • 将题目改成将数组分成两部分,能被3整除的在不能被3整除的前面;

为了让代码的扩展性更强,可以将这些判断条件单独写成一个函数接口,而主代码框架保持不变。

代码:

#include <iostream>
#include <vector> using namespace std; // not changed the relative position
void ReOrderOddEven_1(vector<int> &array){
if(array.size()<=0)
return;
vector<int> odds;
vector<int> evens;
unsigned int i;
for(i=0;i<array.size();i++){
if((array[i]&0x1)!=0)
odds.push_back(array[i]);
else
evens.push_back(array[i]);
}
for(i=0;i<odds.size();i++)
array[i]=odds[i];
int k=i;
for(i=0;i<evens.size();i++)
array[k++]=evens[i];
} // changed the relative position
void ReOrderOddEven_2(int *pdata,unsigned int length){
if(pdata==NULL || length<=0)
return;
int *pBegin=pdata;
int *pEnd=pdata+length-1; while(pBegin<pEnd){
while(pBegin<pEnd && (*pBegin&0x1)!=0)
pBegin++;
while(pBegin<pEnd && (*pEnd&0x1)==0)
pEnd--;
if(pBegin<pEnd){
int tmp=*pBegin;
*pBegin=*pEnd;
*pEnd=tmp;
}
}
} bool isEven(int n){
return (n&1)==0;
} // more expansible
void ReOrderOddEven_3(int *pdata,unsigned int length,bool (*func)(int)){
if(pdata==NULL || length<=0)
return;
int *pBegin=pdata;
int *pEnd=pdata+length-1; while(pBegin<pEnd){
while(pBegin<pEnd && !func(*pBegin))
pBegin++;
while(pBegin<pEnd && func(*pEnd))
pEnd--;
if(pBegin<pEnd){
int tmp=*pBegin;
*pBegin=*pEnd;
*pEnd=tmp;
}
}
} int main()
{
int A[]={1,2,3,4,5,6,7,8,9};
int length=sizeof(A)/sizeof(A[0]);
ReOrderOddEven_2(A,length);
for(int i=0;i<length;i++)
cout<<A[i]<<" ";
cout<<endl; int B[]={1,2,3,4,5,6,7,8,9};
vector<int> C(B,B+length);
ReOrderOddEven_1(C);
for(int i=0;i<length;i++)
cout<<C[i]<<" ";
cout<<endl; ReOrderOddEven_3(B,length,isEven);
for(int i=0;i<length;i++)
cout<<B[i]<<" ";
cout<<endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/beb5aa231adc45b2a5dcc5b62c93f593?rp=1

AC代码:

class Solution {
public:
void reOrderArray(vector<int> &array) {
  if(array.size()<=0)
return;
vector<int> odds,evens;
unsigned int i;
for(i=0;i<array.size();i++){
if((array[i]&0x1)!=0)
odds.push_back(array[i]);
if((array[i]&0x1)==0)
evens.push_back(array[i]);
} for(i=0;i<odds.size();i++)
array[i]=odds[i];
int k=i;
for(i=0;i<evens.size();i++)
array[k++]=evens[i];
}
};

  

(剑指Offer)面试题14:调整数组顺序使奇数位于偶数前面的更多相关文章

  1. C++版 - 剑指offer面试题14: 调整数组顺序使奇数位于偶数前面

    题目: 调整数组顺序使奇数位于偶数前面 热度指数:11843 时间限制:1秒 空间限制:32768K 本题知识点: 数组 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇 ...

  2. 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...

  3. 剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面

    剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面2013-11-30 02:17 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部 ...

  4. 剑指offer(13)调整数组顺序使奇数位于偶数前面

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

  5. 【剑指Offer】13、调整数组顺序使奇数位于偶数前面

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

  6. 【剑指offer】Q14:调整数组顺序使奇数位于偶数前面

    def isOdd(n): return n & 1 def Reorder(data, cf = isOdd): odd = 0 even = len( data ) - 1 while T ...

  7. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

    题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...

  8. 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面

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

  9. 《剑指offer》面试题14 调整数组顺序使奇数位于偶数前面 Java版

    (输入整数数组,使所有奇数位于前半部分,所有偶数位于后半部分.) 我的方法:想到用两个下标分别表示奇数和偶数的界线,一个在开头,一个在末尾,判断每一个数字的类别,然后将它放入对应的范围内,移动下标,直 ...

  10. 剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面

    题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序, 使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门. 这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑 我们将 ...

随机推荐

  1. 【转】Linux设备驱动之I/O端口与I/O内存

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281367.html 一.统一编址与独立编址 该部分来自于:http://blog.ch ...

  2. RequireJS进阶(二) 转

    这一篇来认识下打包工具的paths参数,在入门一中就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”,但文件 ...

  3. K2 Blackpearl开发技术要点(Part2)

    转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685282.html K2 Blackpearl开发技术要点(Part2)  

  4. 脚本乐园 Shell中命令行选项和参数的处理

    在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...

  5. ANT 发布项目中 build.xml 文件的详细配置

    xml 代码 <?xml version="1.0" encoding="UTF-8"?> <!-- name:对应工程名字 default: ...

  6. YII Framework学习教程-YII的安全

    web应用的安全问题是很重要的,在“黑客”盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案.当然这里讲的安全是片面的,但是值得一看. 官方提供的 ...

  7. 用Delphi实现文件关联

      文件关联为我们带来很多的方便.Delphi自带有注册表对象TRegistry,可以通过它取得或改变注册表相关键值的内容. Function GetAssociatedExec(FileExt: S ...

  8. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_from_list(self, locator, *items)

    def select_from_list(self, locator, *items): """Selects `*items` from list identified ...

  9. FreeMarker笔记 第三章 模板

    ,先来一打小白兔: 3.1 总体结构 用程序语言编写的程序就是模板,模板也被成为FTL(代表FreeMarker模板语言). 模板是由如下部分混合而成的: Text文本:文本会照着原样来输出: Int ...

  10. Typecho集成ueditor笔记

    前言:萝卜青菜各有所爱,因为个人需求所以需要在博客中集成ueditor,并非是我不喜欢md语法 其实本篇的笔记的书写最早也是在本地的md编辑器上完成的 1. 首先下载ueditor编辑器,然后重命名文 ...