常见面试题学习(5)
转自: http://www.cnblogs.com/qsort/archive/2011/08/23/2150089.html
1,一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
最直接也最清晰的做法就是排序然后两边往中间同步走,O(nlogn) + O(n)。 这是标准做法,如果有序序列,更好,只用O(n)就行
不过既然相同数值不重复出现,还对空间没啥说的,那就bitmap吧。。。可以做到O(n)。太无聊了,还要揣摩出题人的思路。
2,一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
注意:
- 5个数值允许是乱序的。比如: 8 7 5 0 6
- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4
- 0可以多次出现。
不管是5个还是500个,走一遍看一下min和max,减一减就可以了。。当然附带上0的处理。
3,正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12
(1)、设计一个函数void generate(int a,int b,int N ,int * Q)计算Q的前几项
(2)、设计测试数据来验证函数程序在各种输入下的正确性。
能被a整除的序列,是a的倍数,a, 2a, 3a, ...
能被b整除的序列,是b的倍数,b, 2b, 3b, ...
能被a或者b整除的序列,就是这两个序列的merge。。
既然给出了N,分别计算出a,b的倍数N个,然后合并,当合并后的序列个数达到N时,结束
4,有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型void proc(char *str) 也可以采用你自己熟悉的语言。
这其实是qsort中partition的一步,略。
那个分割的字符应该选择A或者z ,不管给出的原字符串是否含有A或者z,注意一下边界A或者z的处理就行
5,输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。
只要先将整个句子翻转一次,然后每个单词内部再翻转一次,就行了,代码暂略。