常见面试题学习(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”。

只要先将整个句子翻转一次,然后每个单词内部再翻转一次,就行了,代码暂略。

原文地址:https://www.cnblogs.com/hitwtx/p/2152980.html