十一道很好的题,大家一起做,互相讨论。
1. 链表:
1.1判断一个链表是否有循环, 打印一个可能带环的链表中所有元素各一次。
1.2寻找链表中倒数第m个元素。
1.3判断一个ASCII字符串中是否有重复字符。
1.4判断两个链表是否相交,寻找相交节点。
2. 二叉树
2.1 定义二叉树两个结点的最小距离为这两个结点的最近公共祖先分别到这两个结点的路径长度之和。请设计一种方法,找出给定二叉树中任意两个结点的最小距离,可以考虑以图形显示之。
2.2 设计一个程序实线二叉树的层次遍历,要求每层之间的数据用一个空格分开。二叉树采用二叉链表方式进行存储。
3. 利用大顶堆实现一个优先队列。对于队列的操作应该至少支持下列几种指令:
Void enqueue(int ObjectID, int Priority);
Int dequeue();
Void changeweight(int ObjectID, int newPriority);
函数enqueue向优先队列中插入一个ID号为ObjectID,优先级为priority的新对象。函数dequeue从优先队列中删除优先级最高的对象,并返回该对象的ID号。函数changeweight将ID号为ObjectID的对象的优先级改为newPriority。你需要一种机制,以便获取所需要对象在堆中的位置。你还需要对堆的实现进行修改,以存储对象在数组中的位置,使得堆中对象的修改可以在辅助数组结构中记录下来。
4. 图
4.1 套汇是指利用汇率差异将一单位的货币转换为大于一单位的同种货币。例如,假设1美元兑换8.8人民币,1人民币兑换0.1英镑,1英镑兑换1.5美元,那么,如果一个人拿着1美元先兑换成人民币,再把人民币兑换成英镑,最后将英镑兑换成美元,最后他能得到1*8.8*0.1*1.5=1.32美元,从而获得了利润,这就是套汇。假设有n种货币v1,v2,…,vn和有关汇率的n*n矩阵,其中A[I,j]是指一单位货币vi兑换成货币vj的单位数,要求设计一个程序判断是否存在一个货币序列vi1,vi2,…,vik使得A[i1,i2]*A[i2,i3]*…*A[ik,i1]>1,如果存在,则输出所有这样的货币序列,如果不存在则输出空,并确定算法的时间代价。
4.2 贪婪算法:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算法进行安排。
4.3 动态规划设有n种不同面值的硬币,各硬币的面值存在于数足T[n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[n]中。对任意钱数0<=m<=20009,设计一个用最少硬币找钱m的方法。
4.4 分治法:在一个2k*2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘,如图A所示。设计一个程序,用图B所示的4种不同形态的L型骨牌覆盖一个除特殊棋盘上特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。