题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部。

思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移。当满足p1<p2这个条件时,可以将p1向后移并找到第一偶数为止,p2向前移直到找到第一个奇数为止,此时如果还满足p1<p2的条件,则交换p1和p2的值。

c++代码:本代码扩展性的体现为:将函数bool (*func) (int)当做参数传人preorder中,而此时要判断数字的奇偶性,可以写一个如上格式所示的函数:bool isEven(int n).

当题目改变,要求将数组中能整除3的数放在前面,其他的数组放在后面的时候,就可以写一个如上格式所示的其他函数。

#include<iostream>
using namespace std;
void preorder(int* pdata,unsigned int length,bool (*func) (int))
{
if(pdata==NULL||length==)
return;
int* pstart=pdata;
int* pend=pdata+length-;
while(pstart<pend)
{
while(pstart<pend&&!func(*pstart))
pstart++;
while(pstart<pend&&func(*pend))
pend--;
if(pstart<pend)
{
int temp=*pstart;
*pstart=*pend;
*pend=temp;
}
} }
bool isEven(int n)
{
return (n&)==;
}
void preorderOddEven(int* pdata,unsigned int length)
{
preorder(pdata,length,isEven);
}
void main()
{
int a[]={,,,,};
int* pdata=a;
preorderOddEven(pdata,);
for(int i=;i<;i++)
cout<<pdata[i]<<" ";
cout<<endl; }

Java代码:体现扩展性的方法是写一个接口,里面放一个抽象方法boolean func(int n),其他具体的题目,都只要实现这个方法即可。

public class PreorderOddEven {
/*
* 将一个数组中的奇数排在偶数的前面
* @param pdata 数组
* @param length 数组的长度
*/
public void preorder(int[] pdata,int length)
{
if(pdata==null||length<=0)
return;
int pstart=0;
int pend=length-1;
while(pstart<pend)
{
while(pstart<pend&&!isEven(pdata[pstart]))
pstart++;
while(pstart<pend&&isEven(pdata[pend]))
pend--;
if(pstart<pend)
{
int temp=pdata[pstart];
pdata[pstart]=pdata[pend];
pdata[pend]=temp;
}
} }
/*
* 判断数组中数字的奇偶性
* @param n 数组中的数字
*/
public boolean isEven(int n) {
return (n&1)==0;
}
public static void main(String[] args)
{
PreorderOddEven poe=new PreorderOddEven();
int[] a={1,2,3,4,5};
poe.preorder(a,a.length);
for(int i=0;i<5;i++)
System.out.print(a[i]+" "); }
}

剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)的更多相关文章

  1. 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...

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

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

  3. 【剑指Offer面试编程题】题目1516:调整数组顺序使奇数位于偶数前面--九度OJ

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

  4. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  5. 【剑指Offer学习】【面试题14 :调整数组顺序使奇数位于偶数前面】

    题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此全部的奇 ...

  6. 剑指offer—第三章高质量代码(数值的整数次方)

    高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...

  7. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  8. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

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

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  10. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

随机推荐

  1. Good Bye 2015 A. New Year and Days 签到

    A. New Year and Days   Today is Wednesday, the third day of the week. What's more interesting is tha ...

  2. UITableViewCell的重用机制原理

    UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...

  3. Android核心分析之十七电话系统之rilD

    Android电话系统之-rild Rild是Init进程启动的一个本地服务,这个本地服务并没有使用Binder之类的通讯手段,而是采用了socket通讯这种方式.RIL(Radio Interfac ...

  4. java隐士类型转换和强制类型转换

    ,byte和short型在计算时会自动转换为int型计算,结果也是int 型.所以a1*a2的结果是int 型的. byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,b ...

  5. 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]

    c语言中变量分为四类,分别是 1.auto   自动变量 2.static   静态存贮分配变量(又分为内部静态和外部静态) 3.extern  全程变量(用于外部变量说明) 4.register   ...

  6. HTML5之拖拽(兼容IE和非IE)

    前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实 ...

  7. Jenkins Master/Slave架构

    原文:http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html 一 Jenkins Master/Slave架构 Master/Slav ...

  8. Android从零单排之自动跟新

    自动更新原理 当我们发布我们的应用程序的时候,肯定会想到后续版本的更新,那么该怎么对我们的程序进行更新呢? 更新APK的原理实际上就是比较程序中的AndroidManifest.xml中的versio ...

  9. struts2与struts1整合,Unable to load configuration. - interceptor-ref ... struts.xml

    struts.xml中为了与struts1的MVC模式整合,需要类似如下的拦截器的引用 <interceptor-stack name="integration"> & ...

  10. USACO Section 2.2: Runaround Numbers

    简单题 /* ID: yingzho1 LANG: C++ TASK: runround */ #include <iostream> #include <fstream> # ...