九章算法面试题32 小球排序

九章算法官网-原文网址

http://www.jiuzhang.com/problem/32/

题目

有红黄蓝三色的小球若干排成一列,这些小球进行排序,请使用尽量少的空间和时间。

解答

假设顺序为红色黄色蓝色。用两根指针从头开始遍历,第一根指针遇到非红色时停下,如果第二根指针找到第一根指针之后的第一个红色停下,交换两根指针所指颜色。重复上述过程。直到第二根指针找不到任何红色。此时第一根指针到最后都是黄色或蓝色。以黄色为标准继续往后做相同的操作,则可以把黄色和蓝色排好序。在遍历的过程中,由于第二根指针不需要每次都回到第一根指针所在位置往后遍历,所以复杂度是O(n)的。

面试官角度

这个题目是对排序算法的考察。很显然,一般来说求职者至少都能够答上O(nlogn)的排序方法。进一步也可能会想到使用计数排序的O(n)的方法(因为只有三个颜色,统计每个颜色的个数即可)。此时面试官会要求说,如果不适用计数排序,通过简单的比较和交换能否获得O(n)的效率呢?很多求职者此时就会蒙掉,因为他们觉得计数排序已经最好了,面试官一定是在为难自己。在面试的过程中如果出现这种心态(觉得面试官为难自己)是非常可怕的,面试官从来不会为难求职者。面试官只是希望通过设定不同的限制条件,考察求职者的思维活跃程度。因为在实际工程中,很多情况下,都无法完全在理想的外界环境下考虑问题,需要同时考虑很多限制条件,此时正是你展现才能的时候,抓住面试官“为难”你的机会,才能脱引而出,拿到Offer。

时间: 2024-07-30 03:57:05

九章算法面试题32 小球排序的相关文章

九章算法面试题65 拓扑排序

九章算法官网-原文网址 http://www.jiuzhang.com/problem/66/ 题目 给一个有向无环图,求出这个有向无环图的拓扑排序结果. 在线测试本题 http://www.lintcode.com/en/problem/topological-sorting/ 解答 [背景知识] 拓扑排序问题在我们生产工序或者是建立依赖关系当中有重要的运用. 通常我们所说的拓扑排序是对一个有向无环图的. 所以把一个有向无环图的顶点组成的序列,每个点只出现一次,并且A在序列中排在B的前面图中不

九章算法面试题43 直方图内最大矩阵

九章算法官网-原文网址 http://www.jiuzhang.com/problem/43/ 题目 给出一个直方图(如图所示),求出所给直方图中所包含的最大矩阵面积.直方图可以用一个整数数组表示,如上图为[2, 1, 5, 6, 2, 3].每个直方块的宽度均为1.上图中包含的最大矩阵面积为10. 解答 如果对于每个直方块,找到从它开始往左边数第一个比它小的,和往右边数第一个比他小的,则可以确定出以该直方块为最矮一块的矩阵的最大面积.使用数据结构栈,栈中保存递增序列,从左到右依次遍历每个数让其

九章算法面试题31 子数组的最大差

九章算法官网-原文网址 http://www.jiuzhang.com/problem/31/ 题目 给定一个数组,求两个不相交的并且是连续的子数组A和B(位置连续),满足|sum(A) - sum(B)|最大(和之差的绝对值).例如[2, -1, -2, 1, -4, 2, 8],可以得到A=[-1, -2, 1, -4], B=[2, 8],最大差为16. 解答 预处理每个位置往左/右的最大/最小子数组,然后再枚举划分位置,求得所有MaxLeft[i] - MinRight[i+1]和Max

九章算法面试题37 主元素

九章算法官网-原文网址 http://www.jiuzhang.com/problem/37/ 题目 主元素(Majority Number)定义为数组中出现次数严格超过一半的数.找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶1:如果数组中存在且只存在一个出现次数严格超过1/3的数,找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶2:如果数组中存在且只存在一个出现次数严格超过1/k的数,找到这个数.要求使用O(k)的额外空间和O(n)的时间 解答 采用抵消法.一旦发

九章算法面试题40 不用除法求积

九章算法官网-原文网址 http://www.jiuzhang.com/problem/40/ 题目 给定一个数组A[1..n],求数组B[1..n],使得B[i] = A[1] * A[2] .. * A[i-1] * A[i+1] .. * A[n].要求不要使用除法,且在O(n)的时间内完成,使用O(1)的额外空间(不包含B数组所占空间). 解答 计算前缀乘积Prefix[i] = A[1] * A[2] .. A[i],计算后缀乘积Suffix[i] = A[i] * A[i+1] ..

九章算法面试题50 队列上实现Min函数

九章算法官网-原文网址 http://www.jiuzhang.com/problem/50/ 题目 ?在<九章算法面试题23 栈上实现Min函数>中,我们介绍了在栈上实现一个O(1)的Min方法.那么,如何在队列上实现一个Min方法? 要求,队列除了支持基本的Push(x) Pop()的方法以外,还需要支持Min方法,返回当前队列中的最小元素.每个方法的均摊复杂度为O(1) 解答 在九章面试题49<用栈实现队列>和面试题23<栈上实现Min函数>中,我们讲解到了如何用

九章算法面试题62 合并k个排序数组

九章算法官网-原文网址 http://www.jiuzhang.com/problem/62/ 题目 给出K个排序好的数组,用什么方法可以最快的把他们合并成为一个排序数组? 在线测试本题 http://lintcode.com/en/problem/merge-k-sorted-lists/ 解答 这中题目分布式系统经常运用到,比如来自不同客户端的排序好的链表想要在主服务器上面合并起来. 一般这种题目有两种做法. 第一种做法比较容易想到,就是有点类似于MergeSort的思路,就是分治法.先把k

九章算法面试题39 分割数组

九章算法官网-原文网址 http://www.jiuzhang.com/problem/39/ 题目 给一个数组A,和一个整数k,将数组分成两个部分(你可以移动数组中的数),使得左边部分的数都<k,右边部分的数都>=k.要求使用O(1)的额外空间,和O(n)的时间. 解答 利用快速排序的思想.用两根指针i和j,一根指向头,一根指向尾,将头移动到第一个不满足A[i]<k的数,将尾巴移动到第一个不满足A[j]>=k的数,交换两个数,然后重复往下查找不满足A[i]<k和A[j]&g

九章算法面试题35 构造最大数

九章算法官网-原文网址 http://www.jiuzhang.com/problem/35/ 题目 给定一个只包含正整数的数组,给出一个方法,将数组中的数拼接起来,使得拼接后的数最大.例如,[1, 32, 212]拼接之后,所得到的最大数为322121. 解答 方法一: 这道题的关键在于怎么确定每个数在最后结果中的排列位置,大家第一步想到的是肯定是第一位数越大的越靠前,如8在6, 5之前:如果第一位相同的情况出现那么再看第二位,比如下面这个例子[4,45,40]中, 45应当在40之前:难点是