剑指offer-高质量的代码(调整数组顺序使得奇数位于偶数的前面)

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

思路:用两个指针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==0)
        return;
    int* pstart=pdata;
    int* pend=pdata+length-1;
    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&1)==0;
}
void preorderOddEven(int* pdata,unsigned int length)
{
    preorder(pdata,length,isEven);
}
void main()
{
    int a[5]={1,2,3,4,5};
    int* pdata=a;
    preorderOddEven(pdata,5);
    for(int i=0;i<5;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]+" ");

    }
}
时间: 2024-07-31 16:55:14

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

剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面

一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345,经过调整后可以为:15342.13542.13524等等. 二.解题思路 2.1 基本解法 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位.由于每碰到一个

【剑指Offer】面试题21. 调整数组顺序使奇数位于偶数前面

题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums =?[1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一. 提示: 1 <= nums.length <= 50000 1 <= nums[i] <= 10000 思路 代码 时间复杂度:O(n) 空间复杂度:O(1) class Solution { public: vector<int>

剑指offer第十三题:调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 自己用了额外空间实现函数: 1 import java.util.*; 2 public class Solution { 3 public void reOrderArray(int [] array) { 4 Stack<Integer> s = new Stack<Integer>(); 5 int l =

【剑指offer 面试题14】调整数组顺序使奇数位于偶数前面

思路: 头尾指针,向中间遍历,依据条件交换元素. 1 #include <iostream> 2 using namespace std; 3 4 void reOrder(int *pData, unsigned int len, bool (*func)(int)) 5 { 6 if(pData == NULL || len == 0) 7 return ; 8 9 int *pStart = pData; 10 int *pEnd = pData + len - 1; 11 12 whi

剑指offer-数值的整数次方-调整数组顺序使奇数位于偶数前面-代码的完整性-python

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 思路 求base的exponent次方,exponent有两种可能性, exponent>0 for循环exponent次,结果与base相乘 exponent<0 for循环exponent次,结果与base相除 输出结果: # -*- coding:utf-8 -*- class Solution: def Power(self

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

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. 1 package Solution; 2 3 /** 4 * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 5 * 题目:输入一个整数数组,实现一

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

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

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

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

def isOdd(n): return n & 1 def Reorder(data, cf = isOdd): odd = 0 even = len( data ) - 1 while True: while not isOdd( data[ even ]) : even -= 1 while isOdd( data[ odd ]) : odd += 1 if odd >= even: break data[ even ], data[ odd ] = data[ odd ], data

《剑指Offer》题目:调整数组顺序使奇数位于偶数前面

题目描述:调整数组顺序使奇数位于偶数前 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 题目分析: 题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变. Java代码: public class ReOrderArray { //这种方法不能保证奇数和奇数,偶数和偶数之间的相对位置不变 public static void reOrderArray(