1、写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。
函数接口为:int find_orderk(const int* narry,const int n,const int k)
Answer:另外使用一个数组b[]记录原来的数据,再使用堆排序,进行k次堆排序,然后输出堆顶的元素。将该元素输m出后,在b[]中遍历查找m的位置,然后输出
2、 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。 (此题10分 )
(不用考虑数值超出计算机整数界限的问题)
Answer:(采用数组a[M]记录N!的每一位,a[0]放置该数字的长度,然后遍历整个数组,计算尾部连续的0的个数。)
http://blog.csdn.net/sailor_8318/archive/2008/10/17/3088162.aspx
Baidu和EMC的笔势题:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。(不用考虑数值超出计算机整数界限的问题)
思路分析:
本题要用数学的方法来解决效率最高,连续K个0,则说明是10^K的倍数,即(2×5)^ K= 2^K× 5^K;待求的数为N*(N-1)(N-2)………1,由于每两个数至少可以分解出1个2,2肯定比5多,因此K的个数取决于上式的分解因子中有几个5的问题;能拆解出5的只可能是5的倍数,而能拆解出多少个5则看这个数是5的几次方的倍数了
方法一:
int ZerosForN_1(int n)
{
int fives,result=0,i;
for(fives=5; n >=fives; fives+=5) // 循环次数为n/5
{
for(i=fives; i%5==0; i/=5) // 此处的最大循环次数为 LOG5(N)
{
++result;
}
}
//printf("%d/n",result);
return result;
}
for循环的算法复杂度最容易看出来,就是for循环的次数,最大循环次数为n/5 * LOG5(N) ,因此复杂度是O(nlogn)的
思路最清晰,即对于每个5的倍数的值,求其可被5整除的次数,即可求出最后5的因子个数和
方法二:
int ZerosForN_2(int n)
{
int pow5,result=0;
for(pow5=5; n >=pow5; pow5*=5) // 此处的循环次数为LOG5(N)
{
result+=n / pow5;
}
//printf("%d/n",result);
return result;
}
N不变,pow5以5的幂递增,此算法的思想是求出N以内所有被5整除的数的个数,所有被25整除的个数(在5的基础上多出了一个5因子),所有被125整除的个数(在25的基础上多出了一个5因子)。。。。
设最大数为N,
设5^(n+1) > N >= 5^n
[N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^n)] 即为连续0的个数
上述式子的项数为log5(N),即为循环的次数,故复杂度为log5(N)
方法三:
[N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^n)]
=[N/5] + [[N/5]/5] + [ [[N/5]/5]/5] + ... + [。。。]
=A1+ [A1/5] + [A2/5] + ... + [An-1/5]
即上述各项构成等比数列,An=An-1/5,等比为1/5
即对A1反复除5,只要其大于0,即相加,便得到以下算法:
int ZerosForN_3(int n)
{
int result=0;
n/=5; // A1
while(n >0
{
result += n; //求和
n/=5; // 求An
}
//printf("%d/n",result);
return result;
}
等比数列的项数为log5(N),即为循环的次数,故复杂度为log5(N)
3、 编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
如下形式叫做首页:
militia.info/
www.apcnc.com.cn/
http://www.cyjzs.comwww.greena888.com/
www.800cool.net/
http://hgh-products.my-age.net/
如下形式叫做目录页:
thursdaythree.net/greenhouses--gas-global-green-house-warming/
http://www.mw.net.tw/user/tgk5ar1r/profile/
http://www.szeasy.com/food/yszt/chunjie/
www.fuckingjapanese.com/Reality/
( 此题10分)
请注意:
a) url有可能带http头也有可能不带
b)动态url(即含有"?"的url)的一律不算目录页,如:
www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/
www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/
另:如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。
Answer:
http://hi.baidu.com/cuifenghui/blog/item/bea757435238a0129213c609.html
/***********************************************
描述: 编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
如下形式叫做首页:
militia.info/
www.apcnc.com.cn/
http://www.cyjzs.comwww.greena888.com/
www.800cool.net/
http://hgh-products.my-age.net/
如下形式叫做目录页:
thursdaythree.net/greenhouses--gas-global-green-house-warming/
http://www.mw.net.tw/user/tgk5ar1r/profile/
http://www.szeasy.com/food/yszt/chunjie/
www.fuckingjapanese.com/Reality/
请注意:
a) url有可能带http头也有可能不带
b)动态url(即含有"?"的url)的一律不算目录页,如:
www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/
www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/
另:如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。
思路: 经观察,首页类的url中之多含有3个/(http头的//和末尾的/),或者只含有1个
/(没有http头),而目录类的url所含的个数至少为2个(此时不含http头)或至少4个(此时
包含http头)。如果url中出现?则视为动态网页,归类为其他网页。
作者: xiaocui
时间: 2007.9.12
版本: v1.0
**************************************************************************/
#include <iostream>
#include <string>
using namespace std;
string result[3] = {"首页","目录页","其他页"};
string getCategory(string url)
{
//首先判断是否是动态网页
if ( strchr(url.c_str(),'?') != NULL )
{
return result[2];
}
bool isHttp; //是否包含http头
if ( strstr(url.c_str(), "http://") != NULL )
{
isHttp = true;
}
else
{
isHttp = false;
}
if ( isHttp == true )
{
char* buff = new char[url.size()-7]; //去除http://和最后的/
int i;
for(i=0; i<url.size()-8; ++i)
{
buff[i] = url[7+i];
}
buff[i] = '/0';
if ( strchr(buff,'/') == NULL )
{
delete[] buff;
return result[0];
}
else
{
delete[] buff;
return result[1];
}
}
else
{
char* buff = new char[url.size()+1];
strcpy(buff,url.c_str());
buff[strlen(buff)-1] = '/0'; //去除最后的/
if ( strchr(buff,'/') == NULL )
{
delete[] buff;
return result[0];
}
else
{
delete[] buff;
return result[1];
}
}
}
int main()
{
cout << "请输入url: ";
string url;
cin >> url;
cout << "url类型为: " <<getCategory(url) << endl;
return 0;
}
4、 如果必须从网页中区分出一部分"重要网页"(例如在10亿中选8亿),比其他网页更值得展现给用户,请提出一种方案。(此题40分)
假设有10亿网页已经被我们存下来,并提供如下信息:网页全文(即网页的源码)、全文长度、网页正文(即网页中提取的主体文字)、 正文长度,以及其他网页提取物等,现在希望去掉其中的重复网页,请提出可行的方案,计算出每个网页对应的重复度,你可以自己
对网页重复下定义,也可以提出需要哪些更多的网页提取物来实现更好的去重复方案
Answer:
http://topic.csdn.net/u/20080523/15/2df34173-58a4-4c36-9438-de1ec8b9cb14.html
1)如果必须从网页中区分出一部分"重要网页"(例如在10亿中选8亿)
PageRank
Lz 说道去掉其中的重复网页
计算相似度,投到向量空间上去,计算夹角
这些都是考Sense的,你若能提出完美的解决方案,百度不去也罢,基本可以自己搞了。
就是,有些公司面试会拿一些公司目前还在设计的算法,群策群力,从中找到一些思想
你可以自己对网页重复下定义——如果想到优秀的算法,有个更好的定义,就可以自己搞了
怀疑这种题不是测试题,就是他们内部的算法需求。
2) http://bbs.chinaunix.net/viewthread.php?tid=983568&page=2
网页除重,根据不同的应用,考虑到效率,又不同的办法。
如果数据量小,可以用词频相似度的办法。Sim(A,B)=2 * same(A,B)/(|A|+|B|),
为了提高速度,可以先对所有文档建立词级的倒排索引表,记录长度表。这样输入一篇新的文档,求与它相似的所有文档的时候,就不需要>把输入文档与库中记录一一比较。只需要切词,检索,索引归并,截取,就能找到所有相似文章。可以用title来做,也可以用content来做。>这种方法的复杂度几乎为常数。
对于垂直领域的搜索,这种种方法是足够了。
如果数据量实在太庞大。目前只有关键词签名法,最长句子签名法。(对于通用搜索引擎)
首先,网页去重分为链接去重和内容去重。链接是否重复可以使用布隆过滤器,内容去重可以使用向量空间模型,计算两个网页的夹角;也可以提取网页的适当内容,然后判断这些内容是否相似来判断两个个网页的重复读。