算法练习题
天下第一好大人
天下第一好大人
展开
-
[Simple] 洗牌算法
题目要求:平时洗牌是两打牌,交叉洗在一起.也就是开始 1 2 3 4 5 6 7 8第一次 1 5 2 6 3 7 4 8第二次 1 3 5 7 2 4 6 8。。。第k次 ...给你一个数组a[2N],要求在O(1)的空间复杂度内给a[2N]k次洗牌.解决方案:首先寻找规律,有如下性质:1> 最开始和最后的两张牌永远不变 2> 中间有2N-2张牌,即一张牌最多可能有2N-原创 2009-12-01 22:48:00 · 4994 阅读 · 7 评论 -
[面试题] 5,7,12通过加减得到n,求最小步数(特点是5+7=12)
假设由A到B需要k步,分别是A1,A2,……Ak,每一步都是(5,-5,7,-7,12,-12)中一个。因为最终结果就是A1+A2+……+Ak,所以这k步是可以调换顺序的(加法交换律)。1> 如果这k步里,同时存在5,-5,那么可以约去。同理,(7,-7),(12,-12)也是。即最多存在8种选择,选定了一个数,那么它的相反数就不能出现。2> 7+5=12,(-7)+(-5)=(-12),12+(原创 2011-06-23 15:34:00 · 2778 阅读 · 0 评论 -
[面试题] 已知比例,找出数组中出现较多的元素
问题摘自《编程之美》。问题1:一个无序数组中某一个元素A的出现次数大于总数的1/2,如何找到它?问题2:一个无序数组中,如果有三个元素A、B、C的出现次数都大于总数的1/4,如何找到它们? 答案1:a> 对数组排序,O(nlogn),然后遍历一下排好序的数组,原创 2011-07-05 16:44:18 · 1246 阅读 · 0 评论 -
[Simple] 方阵由外向内旋转排列,打印
问题要求:输入N,打印N*N方阵,旋转着向内排列,最后到中心。 例如: 输入:3输出:1 2 38 9 47 6 5 输入:4输出:1 2 3 412 13 14 511 16 15 610 9 8 7 解决方案:如果用模拟法,就是先开辟一个N*N的二维数组,全部初始化为0,然后模拟这个旋原创 2009-11-03 15:24:00 · 945 阅读 · 0 评论 -
[C++] 屏幕打印出1-1000这1000个数字,不许用循环for while,不许用分支if,不许用跳转goto
最简单的是宏展开,很巧妙:#include #define A(x) x;x;x;x;x;x;x;x;x;x;int main () { int n = 1; A(A(A(printf ("%d ", n++)))); return 0;}比较高级的是用C++的构造函数特性——对象创建时默认调用构造函数:#include using namespace std;class A{ static int i;public: A(){cout 最后一转载 2010-08-28 01:51:00 · 2090 阅读 · 0 评论