备注: 转至 周磊的博客,http://blog.csdn.net/v_JULY_v/article/details/6234496
1、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
2、两个数相乘,小数点后位数没有限制,请写一个高精度算法
3、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?
4、有12个小球,外形相同,其中一个小球的质量与其他11个不同,
给一个天平,问如何用3次把这个小球找出来,并且求出这个小球是比其他的轻还是重
5、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
6、一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
7、腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。
8、给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】
举一个例子:
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..
9、设计一个魔方(六面)的程序。
10、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。
11、收藏了1万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)
12、 在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。 如:“J* Smi??” 可以匹配“John Smith” .
请用C语言实现如下函数:
void scan(const char* pszText, const char* pszName);
注:pszText为整个文章字符,pszName为要求匹配的英文名。请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。
解决方法一:(此段代码已经多个网友指出,bug不少,但暂没想到解决办法):
- //copyright@ falcomavin && July
- //updated:
- //多谢Yingmg网友指出,由于之前这代码是从编译器->记事本->本博客,辗转三次而来的,
- //所以,之前的代码不符合缩进规范,
- //特此再把它搬到编译器上,调整好缩进后,不再放到记事本上,而是直接从编译器上贴到这里来。
- //July,说明。2011.04.17。
- #include <iostream>
- using namespace std;
- int scan(const char* text, const char* pattern)
- {
- const char *p = pattern; // 记录初始位置,以便patten匹配一半失败可返回原位
- if (*pattern == 0) return 1; // 匹配成功条件
- if (*text == 0) return 0; // 匹配失败条件
- if (*pattern != '*' && *pattern != '?')
- {
- if (*text != *pattern) //如果匹配不成功
- return scan(text+1, pattern); //text++,寻找下一个匹配
- }
- if (*pattern == '?')
- {
- if (!isalpha(*text)) // 通配符'?'匹配失败
- {
- pattern = p; // 还原pattern初始位置
- return scan(text+1, pattern); //text++,寻找下一个匹配
- }
- else // 通配符'?'匹配成功
- {
- return scan(text+1, pattern + 1); //双双后移,++
- }
- }
- return scan(text, pattern+1); // 能走到这里,一定是在匹配通配符'*'了
- }
- int main()
- {
- char *i, *j;
- i = new char[100];
- j = new char[100];
- cin>>i>>j;
- cout<<scan(i,j);
- return 0;
- }
解决方法二:
- //qq120848369:
- #include <iostream>
- using namespace std;
- const char *pEnd=NULL;
- bool match(const char *pszText,const char *pszName)
- {
- if(*pszName == '/0') // 匹配完成
- {
- pEnd=pszText;
- return true;
- }
- if(*pszText == '/0') // 未匹配完成
- {
- if(*pszName == '*')
- {
- pEnd=pszText;
- return true;
- }
- return false;
- }
- if(*pszName!= '*' && *pszName!='?')
- {
- if(*pszText == *pszName)
- {
- return match(pszText+1,pszName+1);
- }
- return false;
- }
- else
- {
- if(*pszName == '*')
- {
- return match(pszText,pszName+1)||match(pszText+1,pszName);
- //匹配0个,或者继续*匹配下去
- }
- else
- {
- return match(pszText+1,pszName+1);
- }
- }
- }
- void scan(const char *pszText, const char *pszName)
- {
- while(*pszText!='/0')
- {
- if(match(pszText,pszName))
- {
- while(pszText!=pEnd)
- {
- cout<<*pszText++;
- }
- cout<<endl;
- }
- return;
- }
- }
- int main()
- {
- char pszText[100],pszName[100];
- fgets(pszText,100,stdin);
- fgets(pszName,100,stdin);
- scan(pszText,pszName);
- return 0;
- }
wangxugangzy05:
这个是kmp子串搜索(匹配),稍加改造,如 abcabd*?abe**??de这个窜,我们可以分成abcabd,?,abe,?,?,并按顺序先匹配abcabd,当匹配后,将匹配的文章中地址及匹配的是何子串放到栈里记录下来,这样,每次匹配都入栈保存当前子串匹配信息,当一次完整的全部子串都匹配完后,就输出一个匹配结果,然后回溯一下,开始对栈顶的子串的进行文中下一个起始位置的匹配。