1、 输出hanoi塔的中间移动过程,复杂度
Hanoi比较简单,时间复杂度是O(2exp n)(why?)
2、 给您一个二叉树(元素值都是int类型),输入整数a,b,计算二叉树中在[a,b]区间的节点个数。
A:遍历过程(先序遍历、或者中序遍历、后续遍历)。
3、 判断两个字符串是不是同性异构体(长度一样,相同的字符组成,字符个数也一样,字符位置不一样)
A:建立2个数组COUT1[256],COUT2[256],记录char * str1和char *str2的每个字符出现个数,然后比较2个数组是否相等。
4、 整形数组里面,返回出现次数大于一半的元素(编程之美)
A: 介绍一个时间复杂度为O(n)的算法。
每次删除2个不同的元素,剩下的元素里面,之前出现次数大于一半的元素现在出现次数也是大于一半。
5、 128bit的二进制流里面查找8bit二进制流出现的次数
A:我的理解是,二进制流其实就是一个字符串。利用KMP算法计算。
6、 如下图所示,红色矩阵为一个运动物体,可以在水平方向移动,地底下有陷进(黑色)
运动物体每次运动步伐只能是自然数的平方(table[]存放,1,4,9,16,25,。。。),求给定initPos,goalPos,和holePos[]数组,怎么计算移动的最少次数
水平轨道 |
|
|
|
|
|
|
|
|
|
地下是否有陷阱 |
|
|
|
|
|
|
|
|
|
水平轨 道坐标 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
A:
1) 算出initPos和goalPos之间的距离len
2) 再在table数组里面寻找一个最接近len的数,table[A1],剩余距离为:
Len[1] = (len – table[A1] )(可能为负数,负数的时候下次运动方向为:终点—>起始点)
3) 再在table数组里面寻找一个最接近len[1]的数,table[A2],剩余距离为:
如果len[1] >0,len[2] = (len[1] – table[A2] )
如果len[1] <0,len[2]= (len[1] + table[A2] )
(可能为负数,负数的时候下次运动方向为:终点—>起始点,正数的时候下次运动方向为:起点—>终点)
4) 循环步骤3,直到len[n] = 0,这样移动次数为n