JZ-C-14

剑指offer第十四题:调整数组顺序使得奇数在偶数之前

  1 //============================================================================
  2 // Name        : JZ-C-14.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description :调整数组顺序使得奇数在偶数之前
  7 //============================================================================
  8
  9 #include <iostream>
 10 #include <stdio.h>
 11 using namespace std;
 12
 13 void Reorder(int *pData, unsigned int length, bool (*func)(int));
 14 bool isEven(int n);
 15
 16 // ====================方法一====================
 17 void ReorderOddEven_1(int *pData, unsigned int length) {
 18     if (pData == NULL || length == 0)
 19         return;
 20
 21     int *pBegin = pData;
 22     int *pEnd = pData + length - 1;
 23
 24     while (pBegin < pEnd) {
 25         // 向后移动pBegin,直到它指向偶数
 26         while (pBegin < pEnd && (*pBegin & 0x1) != 0)
 27             pBegin++;
 28
 29         // 向前移动pEnd,直到它指向奇数
 30         while (pBegin < pEnd && (*pEnd & 0x1) == 0)
 31             pEnd--;
 32
 33         if (pBegin < pEnd) {
 34             int temp = *pBegin;
 35             *pBegin = *pEnd;
 36             *pEnd = temp;
 37         }
 38     }
 39 }
 40
 41 // ====================方法二====================
 42 void ReorderOddEven_2(int *pData, unsigned int length) {
 43     Reorder(pData, length, isEven); //将判断标准函数指针作参数传入,修改判断标准函数即可实现模式应用
 44 }
 45
 46 void Reorder(int *pData, unsigned int length, bool (*func)(int)) { //函数指针:同:typedef bool (*FuncPointer)(int); FunPointer func = isEven;
 47     if (pData == NULL || length == 0)
 48         return;
 49
 50     int *pBegin = pData;
 51     int *pEnd = pData + length - 1;
 52
 53     while (pBegin < pEnd) {
 54         // 向后移动pBegin
 55         while (pBegin < pEnd && !func(*pBegin))
 56             pBegin++;
 57
 58         // 向前移动pEnd
 59         while (pBegin < pEnd && func(*pEnd))
 60             pEnd--;
 61
 62         if (pBegin < pEnd) {
 63             int temp = *pBegin;
 64             *pBegin = *pEnd;
 65             *pEnd = temp;
 66         }
 67     }
 68 }
 69
 70 bool isEven(int n) {
 71     return (n & 1) == 0;
 72 }
 73
 74 // ====================测试代码====================
 75 void PrintArray(int numbers[], int length) {
 76     if (length < 0)
 77         return;
 78
 79     for (int i = 0; i < length; ++i)
 80         printf("%d\t", numbers[i]);
 81
 82     printf("\n");
 83 }
 84
 85 void Test(char* testName, int numbers[], int length) {
 86     if (testName != NULL)
 87         printf("%s begins:\n", testName);
 88
 89     int* copy = new int[length];
 90     for (int i = 0; i < length; ++i) {
 91         copy[i] = numbers[i];
 92     }
 93
 94     printf("Test for solution 1:\n");
 95     PrintArray(numbers, length);
 96     ReorderOddEven_1(numbers, length);
 97     PrintArray(numbers, length);
 98
 99     printf("Test for solution 2:\n");
100     PrintArray(copy, length);
101     ReorderOddEven_2(copy, length);
102     PrintArray(copy, length);
103
104     delete[] copy;
105 }
106
107 void Test1() {
108     int numbers[] = { 1, 2, 3, 4, 5, 6, 7 };
109     Test("Test1", numbers, sizeof(numbers) / sizeof(int));
110 }
111
112 void Test2() {
113     int numbers[] = { 2, 4, 6, 1, 3, 5, 7 };
114     Test("Test2", numbers, sizeof(numbers) / sizeof(int));
115 }
116
117 void Test3() {
118     int numbers[] = { 1, 3, 5, 7, 2, 4, 6 };
119     Test("Test3", numbers, sizeof(numbers) / sizeof(int));
120 }
121
122 void Test4() {
123     int numbers[] = { 1 };
124     Test("Test4", numbers, sizeof(numbers) / sizeof(int));
125 }
126
127 void Test5() {
128     int numbers[] = { 2 };
129     Test("Test5", numbers, sizeof(numbers) / sizeof(int));
130 }
131
132 void Test6() {
133     Test("Test6", NULL, 0);
134 }
135
136 int main(int argc, char** argv) {
137     Test1();
138     Test2();
139     Test3();
140     Test4();
141     Test5();
142     Test6();
143
144     return 0;
145 }
时间: 2024-11-05 14:51:49

JZ-C-14的相关文章

poj 3613 Cow Relays(矩阵的图论意义)

题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径. 在此题中我们赋予边权值并把矩阵乘法中的+改为min这样这个矩阵的k次方后C[i,j]就表示从i到j恰好经过k条边的最短路径. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include&l

bzoj 2844: albus就是要第一个出场 线性基

首先线性基是什么呢.我们考虑我们有n个数.子集数量为2^n个.我们将每个子集内的数全部异或起来.得到一个值.但是我们考虑这些值内会可能存在重复的,太多了.不便于运算.所以我们考虑,能不能除去重复的. 我们假定n个数都是<10^9.我们考虑使用一个30*30的矩阵.其中其中第一行,存一个最高位1位于数字第1位的数.第二行存一个最高位1位于数字2位的数.以此类推.这样子我们可以得到一个30*30的的矩阵.这个矩阵未必每一行都填满.我们可以考虑,加入一个元素,发现他对应的行已经被填满了.我们将这个数和

《CODE》读后笔记——第14~25章

反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆性,可以保持信息. 触发器: <code>书中常用的电路 振荡器 分频器 8位行波(异步)计数器 8-1选择器 3-8译码器 字节与十六进制 看完这一章,个人认为十六进制的出现应该就是为了要简单清晰的表示字节吧.四进制表示就只比二进制缩短了1倍,八进制实现不了8个位组成的字节,二百五十六进制太复杂. 在

《CODE》读后笔记——第14~20章

14.反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆性,可以保持信息.各种触发器如下表: <code>书中常用的电路 振荡器 分频器 8位行波(异步)计数器 8-1选择器 3-8译码器 15.字节与十六进制 看完这一章,个人认为十六进制的出现应该就是为了要简单清晰的表示字节吧.四进制表示就只比二进制缩短了1倍,八进制实现不了8个位组成的字节,二百五

CentOS安装glibc-2.14

到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.tar.xz tar glibc-2.14.tar.gz cd glibc-2.14 mkdir build cd build ../configure --prefix=/usr/local/glibc-2.14 make -j4 su xxxx make install 看看现在libc.so.6在哪个位置,然后修改软链接 ln -s /usr/local/glibc-2.14/lib/libc-2.14.

14:Challenge 7(map大法好)

总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求数列中某个值出现了多少次 输入 第一行两个正整数N和M.第二行N的整数表示这个数列.接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的值修改为y:若该字符为'Q',则表示一个询问操作,接下来一次整数x,表示求x这个值出现了多少次. 输出 对每一

14. 流、文件和IO

前言 InputStream/OutStream流用来处理设备之间的数据传输 Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. 流按操作数据分为两种:字节流与字符流 按流向分为:输入流(InputStream)和输出流(OutputStream) Java 为 I/O 提供了强大的而

【Spark深入学习 -14】Spark应用经验与程序调优

----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调优经验 3.1 Spark原理及调优工具 3.2 运行环境优化 3.2.1 防止不必要的分发 3.2.2 提高数据本地性 3.2.3 存储格式选择 3.2.4 选择高配机器 3.3 优化操作符 3.3.1 过滤操作导致多小任务 3.3.2 降低单条记录开销 3.3.3 处理数据倾斜或者任务倾斜 3.

fail2ban-0.8.14 shell自动部署脚本

#!/bin/bash #fail2ban-0.8.14.tar.gz #python > 2.4V #user:root tar  -zxf fail2ban-0.8.14.tar.gz cd /root/fail2ban-0.8.14/ python setup.py install  cp /root/fail2ban-0.8.14/files/redhat-initd /etc/init.d/fail2ban chkconfig --add fail2ban sleep 1 rm -rf

Linux内核编译 Ubuntu 14.04.3 server 升级至3.19.8

读书笔记:<Linux内核设计与实现>,原书第3版,陈莉君 康华 译 第2章:从内核出发     2.3节:编译内核 实验: ============================================================ 系统环境:VM虚拟机 Ubuntu 14.04.3 LTS server版 任务:编译安装新的内核 注意:不要跨大版本,我在3.19版本内 耗时:2小时 所有版本的内核: https://www.kernel.org/pub/linux/kernel