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

【题目描述】

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

【解决方案】

1. 只完成基本功能的解法,仅适用于初级程序员

方法:设置头尾两个指针,满足条件就交换,直到碰头为止。

我的代码实现,仅供参考:

 1         public static void AdjustArray(int[] arr)
 2         {
 3             if (arr == null || arr.Length < 1)
 4             {
 5                 return;
 6             }
 7
 8             int start = 0;
 9             int end = arr.Length - 1;
10
11             while (start < end)
12             {
13                 while ((start < end) && (arr[start] % 2 == 1))
14                 {
15                     start++;
16                 }
17
18                 while ((start < end) && (arr[end] % 2 == 0))
19                 {
20                     end--;
21                 }
22
23                 if (start < end)
24                 {
25                     Swap(arr, end, start);
26                 }
27             }
28         }
29
30         public static void Swap(int[] arr, int indexA, int indexB)
31         {
32             int temp = arr[indexA];
33             arr[indexA] = arr[indexB];
34             arr[indexB] = temp;
35         }

2. 考虑可拓展性的解法,能秒杀Offer

在上述问题中,只是要求奇数偶数分开,如果正数负数分开呢?按照是否能被3整除分开呢?

所以,我可以把判断分类的条件抽离出来,单独形成一个判定条件的函数,哪怕以后改了需求,也只需找到对应函数修改即可。

我的代码实现,仅供参考:

 1         public static void AdjustArray(int[] arr)
 2         {
 3             if (arr == null || arr.Length < 1)
 4             {
 5                 return;
 6             }
 7
 8             int start = 0;
 9             int end = arr.Length - 1;
10
11             while (start < end)
12             {
13                 while ((start < end) && !IsValid(arr[start]))
14                 {
15                     start++;
16                 }
17
18                 while ((start < end) && IsValid(arr[end]))
19                 {
20                     end--;
21                 }
22
23                 if (start < end)
24                 {
25                     Swap(arr, end, start);
26                 }
27             }
28         }
29
30         public static bool IsValid(int num)
31         {
32             return num % 2 == 0;
33         }
34
35         public static void Swap(int[] arr, int indexA, int indexB)
36         {
37             int temp = arr[indexA];
38             arr[indexA] = arr[indexB];
39             arr[indexB] = temp;
40         }
时间: 2024-12-28 21:37:07

【面试题14】调整数组顺序使奇数位于偶数前面的相关文章

面试题 14:调整数组顺序使奇数位于偶数前面

使用两个指针,在数组头尾相对移动: 循环结束条件:头和尾重叠活着头在尾之后 左边指针右移条件:当前数是奇数 右边指针左移条件:当前数是偶数 当且仅当左边指针是偶数,右边指针是奇数,交换两个指针的值 此题注意扩展,函数功能的重用. package offer; import java.util.Arrays; /*面试题 14:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该函数数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的数组位于数组的后半部分.*/ pub

面试题14:调整数组顺序使奇数位于偶数前面

// 面试题14_调整数组顺序使奇数位于偶数前面.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void swap(int *begin,int *end) { int temp; temp=*begin; *begin=*end; *end=temp; } void ReorderOddEven(int *pData,unsigned int len

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

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

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

题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序, 使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门. 这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑 我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后 面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后 就将偶数全部放在了后半部门,奇数放在了前半部分.但是效率不好 每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间 则达到了O(n2) 我们可以用两个索引或者指针,一个指向数组的

刷题14 调整数组顺序使奇数位于偶数前面

描述:  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 假如只需要将奇数位于数组前半部分,偶数位于数组的后半部分, 直接用快速排序解决就好. 但是这里还需要保证奇数间,偶数之间的相对位置不变, 在这里就使用插入排序好了. 1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) {

剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 1.一般想法,不考虑时间复杂度: 每次遍历数组,碰到一个偶数就拿出来,将后面所有数字向前挪动一位,在将该偶数放到最后. 2.利用冒泡排序的思想,两个指针,一前以后,如果前为偶数,后为奇数,就交换. 算法如下: void Reorder_array(int p[],int length) { if(NULL == p || length <= 0) return; int i

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

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解法一:O(n^2) 从头扫描数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位中. 由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n^2). 解法二:O(n) 类似快排,两个指针,一个指向数组头,只向后移动,一个指向数组尾,只向前移动.如果第一个指针指向的数字是偶

【剑指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>

【面试题014】调整数组顺序使奇数位于偶数前面

[面试题014]调整数组顺序使奇数位于偶数前面    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数     位于    数组的前半部分,所有偶数位于数组的后半部分. 1.第一个指针初始化为指向数组的第一个数字,他向后移动 2.第二个指针初始化为指向数组的最后一个数字,他向前面移动, 3.在两个指针相遇之前,第一个指针总是位于第二个指针的前面, 4.如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数, 我们就交换两个数字,否者如果是一个满足,或者都不满足就按照规

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

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