潜水久了,看到很多有趣的小题目,这里做一个收集,很多都已经是很有名了。以后有看到其他好玩的也会不断添进来。
1、有两变量x、y,如何在不用临时空间交换两变量的值?
这题解法很多,有代表性的就是 {y = x+y; x = y-x; y = y-x; } 或者连续异或。都是以时间换空间的方案。
2、一个数组存放了2n+1个整数,其中有n个数出现了2次,1个数出现了1次,找出出现1次的数是多少?
这是在一篇讲笔/面试的博客里看到的(原文:http://www.cnblogs.com/wangbin_ben/archive/2010/11/14/1876947.html#commentform)。第一个想法自然是快排,然后线性扫描。不过这是O(nlogn),考官提示还有更快的,那明显往线性考虑。不过想了很久还是想不出来,最后看了下作者的街解答,是将数组里每一个元素异或,最后得到一个值就是答案。真是精妙啊!
所以以后见到数组,不仅要考虑其下标性质,也要考虑其作为一个整体/每个元素进行处理的性质,说不定会更简单。
3、字符串反转:给定字符串“we;tonight;you;”,编码实现输出“ew;thginot;uoy;”
这题其实不难,主要是想记一下可以用栈来完成各种反转。
4、多个栈模拟队列问题(均只有出/入两种操作)
现在想到的是用2个栈a和b,push时候一样push到a,pop时候先把所有元素丢到另一个栈b中,然后对b进行pop,时间复杂度为4n。伪代码如下:
class stackQueue {
Stack a,b;
void push (elemType Elem) {
a.push(Elem);
}
elemType pop{
if(b.isEmpty())
while !(a.isEmpty()) b.push(a.pop);
return(b.pop);
}
}