zoukankan      html  css  js  c++  java
  • 调整数组顺序使奇数位于偶数前面

    调整数组顺序使奇数位于偶数前面
    • 参与人数:3497时间限制:1秒空间限制:32768K
    • 通过比例:17.74%
    • 最佳记录:0 ms|0K(来自  zhb186

    题目描述

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
     1 /* C++
     2     如果题目要求保证奇数和奇数、偶数和偶数之间的相对位置不变,
     3     就可以使用vector的erase和push_back进行操作。
     4     顺序遍历数组arr,遇到偶数,则删除该值,并将该值push到arr数组的末尾。
     5     时间复杂度为O(n)。
     6     注意:需要设置一个index,控制处理的数值个数,当处理次数等于数组大小时结束,
     7         否则当已将所有偶数放在数组后面时,将进入死循环。
     8 */
     9 
    10 void reOrderArray(vector<int> &arr){
    11     int tmp;
    12     int index = 0;
    13     for (vector<int>::iterator it = arr.begin(); it != arr.end(); ){
    14         index++; 
    15         if ( (*it & 1) == 0){    // 偶数
    16             tmp = *it;
    17             it = arr.erase(it);
    18             arr.push_back(tmp);
    19         }
    20         else
    21             it++;
    22         if (index == arr.size())
    23             return;
    24     }
    25 }
     1 /* C
     2     如果不要求保证奇数和奇数、偶数和偶数之间的相对位置不变!
     3     1、最简单的思路:
     4         与上面的C++方法一样,但是在C中,从头扫描数组,每碰到一个偶数,
     5         就拿出该数字,把该数字后面的所有数字往前移动1位,然后把该数字放在数组末尾。
     6         时间复杂度为O(n^2)。
     7     2、另一种思路:
     8         设置两个指针p1、p2,分别指向数组的第一个和最后一个数字,p1只向后移动,p2指向前移动。
     9         如果p1指向的为偶数,且p2指向的为奇数,则交换这两个数字。
    10         时间复杂度为:O(n)。
    11        在实现中,使用了函数指针,这样就给出了一个模型,可以解决一系列同类型的问题。
    12        eg:所有负数都放在非负数前面;能被3整除的数放在不能被3整除的数前面,等等。
    13 */
    14 bool isEven(int n){
    15     return (n & 1) == 0;
    16 }
    17 void reOrderArray(int *a, int len, bool (*func)(int)){
    18     if (a == NULL || len == 0)
    19         return;
    20     int p1 = 0, p2 = len-1;
    21     while(p1 < p2){
    22         while(p1 < len && !func(a[p1]))    // 向后移动p1,直到p1指向偶数
    23             p1++;
    24         while(p2 >= 0 && func(a[p2]))    // 向前移动p2,直到p2指向奇数
    25             p2--;
    26         if (p1 < p2){
    27             int tmp = a[p1];
    28             a[p1] = a[p2];
    29             a[p2] = tmp;
    30         }
    31     }
    32 }
    33 int main(){
    34     int a[] = {1,2,3,4,5,6,7};
    35     reOrderArray(a, 7, isEven);
    36     for (int i = 0; i < 7;i++)
    37         cout << a[i] << endl;
    38     return 0;
    39 }
  • 相关阅读:
    枚举、函数关于oracle函数listagg的使用说明by小雨
    执行、Mongodb MapReduce示例1个by小雨
    事务、异常TSQL 编码时应该注意的10个问题by小雨
    源、执行GoldenGate 单向DDL同步by小雨
    Oracle中的所有权限by小雨
    数据库、版本数据库学习从此开始by小雨
    统计、案例深入理解Oracle索引(10):索引列字符类型统计信息的32位限制by小雨
    字段、数据库表三大范式及存储方式by小雨
    数据库、用户第二章Getting Start with the Oracle Server(oracle入门)by小雨
    搜索、关键字截图留念,“万能数据库查询分析器”作为关键字在百度和谷歌上的海量搜索结果by小雨
  • 原文地址:https://www.cnblogs.com/qianmacao/p/4870975.html
Copyright © 2011-2022 走看看