各个公司笔试题目集锦

百度公司招聘试题

先看看关于百度的笔试题。希望给大家点启发。

一、选择题:15 分 共 10 题
1. 在排序方法中,关键码比较次数与记录地初始排列无关的是:
A. Shell 排序 B. 归并排序 C. 直接插入排序 D. 选择排序

2. 以下多线程对 int 型变量x的操作,哪几个需要进行同步:
A. x=y; B. x++; C. ++x; D. x=1;

3. 代码
void func()
{
  static int val;
  …
}
中,变量 val 的内存地址位于:
A. 已初始化数据段 B.未初始化数据段 C.堆 D.栈

4. 同一进程下的线程可以共享以下:
A. stack B. data section C. register set D. thread ID

5. TCP 和 IP 分别对应了 OSI 中的哪几层?
A. Application layer B. Data link layer C. Presentation layer D. Physical layer E. Transport layer F. Session layer G. Network layer

6. short a[100],sizeof(a) 返回?
A. 2 B. 4 C. 100 D. 200 E. 400

7. 以下哪种不是基于组件的开发技术_____。
A. XPCOM B. XP C. COM D. CORBA

8. 以下代码打印的结果是(假设运行在 i386 系列计算机上):

字串2


struct st_t

{
  int status;
  short *pdata;
  char errstr[32];
};

st_t st[16];
char *p = (char *)( st[2].errstr + 32 );
printf( "%d", ( p - (char *)(st) ) );

A. 32 B. 114 C. 120 D. 1112

9. STL 中的哪种结构是连续形式的存储:
A. map B. set C. list D. vector

10. 一个栈的入栈序列是 A,B,C,D,E,则栈的不可能的输出序列是:
A. EDCBA B. DECBA C. DCEAB D. ABCDE

二、简答题:20 分,共 2 题
1. (5 分)重复多次 fclose 一个打开过一次的 FILE *fp 指针会有什么结果,并请解释。
考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。

2. (15 分)下面一段代码,想在调用 f2(1) 时打印 err1,调用 f2(2) 时打印 err4,但是代码中有一些问题,请做尽可能少的修改使之正确。
1 static int f1( const char *errstr, unsigned int flag ) {
2   int copy, index, len;
3   const static char **__err = { "err1", "err2", "err3", "err4" };
4
5   if( flag & 0x10000 )
6     copy = 1;
7   index = ( flag & 0x300000 ) >> 20;
8
9   if( copy ) {
10     len = flag & 0xF;
11     errstr = malloc( len );
12     if( errstr = NULL )
13       return -1;
14     strncpy( errstr, __err[index], sizeof( errstr ) );
15   } else
16     errstr = __err + index;
17 }
18
19 void f2( int c ) {
20   char *err;
21
22   swtch( c ) {
23   case 1:
24     if( f1( err, 0x110004 ) != -1 )
25       printf( err );
26   case 2:
27     if( f2( err, 0x30000D ) != -1 )
28       printf( err );
29   }
30 }

Reference: http://www.cnblogs.com/weihai2003/


三、编程题:30 分 共 1 题
注意:要求提供完整代码,如果可以编译运行酌情加分。

1. 求符合指定规则的数。
给定函数 d(n) = n + n 的各位之和,n 为正整数,如 d(78) = 78+7+8=93。 这样这个函数可以看成一个生成器,如 93 可以看成由 78 生成。 字串3
定义数 A:数 A 找不到一个数 B 可以由 d(B)=A,即 A 不能由其他数生成。现在要写程序,找出 1 至 10000 里的所有符合数 A 定义的数。

输出:
1
3


四、设计题:35 分 共 1 题
注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。

1. 假设一个 mp3 搜索引擎收录了 2^24 首歌曲,并记录了可收听这些歌曲的 2^30 条 URL,但每首歌的 URL 不超过 2^10 个。系统会定期检查这些 URL,如果一个 URL 不可用则不出现在搜索结果中。现在歌曲名和 URL 分别通过整型的 SONG_ID 和 URL_ID 唯一确定。对该系统有如下需求:
1) 通过 SONG_ID 搜索一首歌的 URL_ID,给出 URL_ID 计数和列表
2) 给定一个 SONG_ID,为其添加一个新的 URL_ID
3) 添加一个新的 SONG_ID
4) 给定一个 URL_ID,将其置为不可用

限制条件:内存占用不超过 1G,单个文件大小不超过 2G,一个目录下的文件数不超过 128 个。

为获得最佳性能,请说明设计的数据结构、搜索算法,以及资源消耗。如果系统数据量扩大,该如何多机分布处理?
一、选择题:15 分 共 10 题
1. 已知一个线性表(38,25,74,63,52,48),采用的散列函数为 Hash($Key)=$Key mod 7,将元素散列到表长为7的哈希表中存储。请选择后面两种冲突解决方法分别应用在该散列表上进行等概率成功查找的平均查找长度,拉链法 ,线性探测法 .
A. 1.0 B. 1.5 C. 1.7 D. 2.0 E. 2.3
F. 7/6 G. 4/3 H. 3/2

2. 需要将OS缓冲区的数据刷新到硬盘,可以调用的函数有(多选):
A.fflush() B. fsync() C. sync() D.writev()

3. 下面哪个shell语句不能打印出用户主目录的路径?
A. echo "$HOME" B. echo ~
C. echo `$HOME` D. echo $HOME

4. 最坏情况下,合并两个大小为n的已排序数组所需要的比较次数
A.2n B.2n-1 C.2n+1 D.2n-2

5. 一个B类网的子网掩码是255.255.240.0,这个子网能拥有的最大主机数是:
A. 240 B. 255 C.4094 D. 65534

6. 以下代码执行后,val的值是___:
unsigned long val = 0;
char a = 0x48;
char b = 0x52;
val = b << 8 | a;
A 20992 B 21064 C 72 D 0

7. 内存的速度远远高于磁盘速度,所以为了解决这个矛盾,可以采用:
字串2


A 并行技术 B 虚存技术 C 缓冲技术 D 通道技术

8. 以下代码打印的结果是(假设运行在i386系列计算机上):
struct st_t
{
  int status;
  short* pdata;
  char errstr[32];
};

st_t st[16];
char* p = (char*)(st[2].errstr + 32);
printf("%d", (p - (char*)(st)));

A 32 B 114
C 120 D 1112

9. 同一进程下的线程可以共享以下
A. stack B. data section
C. register set D. thread ID

10. 以下哪种操作最适合先进行排序处理?
A 找最大、最小值 B 计算算术平均值
C 找中间值 D 找出现次数最多的值

二、简答题:20分,共2题

1. (6分)下面是一个http请求:
GET /baidu/blog/item/6605d1b4eb6433738ad4b26d.html HTTP/1.1
Host: hi.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
字串8


Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: [url]http://hi.baidu.com/baidu[/url]
Cookie: BAIDUID=AFB70E986AC48B336ABAB7505CDD1C76;

请解释以下各字段基本含义: Host、User-Agent、Accept-Charset、Connection、Referer、Cookie

2. (14分)函数A将字符串str1转成小写,并打印出转化前后的字符串。另外,改错时不能改变函数的接口和主要思路。改错时,请指出行号。
1 #include
2 #include
3
4
5 char* str1 = "ABDFLjlero我们都是saf";
6
7 char* ToLower(char s[])
8 {
9 static size_t i=sizeof(s);
10
11 for (i; i>=0; i--) {
12 if (s>"A" && s<"Z") {
13 s += 26;
14 }
15 }
16 return s;
17 }
18
19 int A()
20 {
21 printf("old str[%s] after lower[%s]n", str1, ToLower(str1));
22 }

三、编程题:30分 共1题
注意:要求提供完整代码,如果可以编译运行酌情加分。 字串2




1. 两个已排序的整型数组,求交集,最快算法
输入:两个已排序的整型数组(int a[m], b[n])
输出:两个数组的交集

四、设计题:35分 共1题
注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。
1. 考虑一个字符串替换的过程,在一个文本文件中含有一些文本内容和一些需要替换的变量,变量的格式为“$Var$”,原来的“$”使用“$$”进行转义,原来的“$$”表示为“$$$”。我们将含有变量的文件称为模板(文件名为t),文本文件的平均长度为100K。另外,还有一系列的变量文件,里面为变量名和变量值的对应关系(文件名为1.v , 2.v… n.v),每个变量文件包含的变量数在百万数量级,且变量排列次序不定。现要求将,模板里的变量分别用变量文件里的变量替换,并将生成的文件写成 (1.r, 2.r… n.r)。
要求:从算法和实现上和实现技术上的细节对程序进行优化,尽量使程序高效。程序运行环境为2G内存,4CPU。阐明主要思路,给出伪码和说明,可以着重指出你使用的优化技术。
例子:模板文件为
This is an $FF$ $$. I like $FF$ and $FA$。 字串9
变量文件为
1.v
FF : banana
FA : apple
2.v
FA: 苹果
FF : 香蕉
则生成文件为
1.r
This is an banana $$. I like banana and apple。
2.r
This is an香蕉 $$. I like 香蕉and苹果。

1)此题10分
对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。
(不用考虑数值超出计算机整数界限的问题)

 

 

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)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailor_8318/archive/2008/10/17/3088162.aspx

 

 



2)此题10分
编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
如下形式叫做首页:
militia.info/
[url]www.apcnc.com.cn/[/url]
[url]http://www.cyjzs.comwww.greena888.com/[/url]
[url]www.800cool.net/[/url]
[url]http://hgh-products.my-age.net/[/url]
如下形式叫做目录页:
thursdaythree.net/greenhouses--gas-global-green-house-warming/
[url]http://www.mw.net.tw/user/tgk5ar1r/profile/[/url]
[url]http://www.szeasy.com/food/yszt/chunjie/[/url]
[url]www.(-_-Q)ingjapanese.com/Reality/[/url]

请注意:
a) url有可能带http头也有可能不带
b)动态url(即含有"?"的url)的一律不算目录页,如:
字串5


[url]www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/[/url]
[url]www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/[/url]

另:如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。

3)此题40分
如果必须从网页中区分出一部分"重要网页"(例如在10亿中选8亿),比其他网页更值得展现给用户,请提出一种方案。

4)此题40分
假设有10亿网页已经被我们存下来,并提供如下信息:网页全文(即网页的源码)、全文长度、网页正文(即网页中提取的主体文字)、
正文长度,以及其他网页提取物等,现在希望去掉其中的重复网页,请提出可行的方案,计算出每个网页对应的重复度,你可以自己
对网页重复下定义,也可以提出需要哪些更多的网页提取物来实现更好的去重复方案

百度网络笔试题目





1.假设Apache产生的日志文件名为access_log,在apache正在运行时,执行命令mv
access_log access_log.bak,执行完后,请问新的apache的日志会打印到哪里,为什么?

2.在Shell环境下,如何查看远程Linux系统运行了多少时间?

3.处理以下文件内容,将域名取出并进行计数排序,如处理:
[url]http://www.baidu.com/index.html[/url]
[url]http://www.baidu.com/1.html[/url]
[url]http://post.baidu.com/index.html[/url]
[url]http://mp3.baidu.com/index.html[/url]
[url]http://www.baidu.com/3.html[/url]
[url]http://post.baidu.com/2.html[/url]
得到如下结果:

域名的出现的次数 域名
3 [url]www.baidu.com[/url]
2 post.baidu.com
1 mp3.baidu.com
可以使用bash/perl/php/c任意一种

4.如果得到随机的字串,长度和字串中出现的字符表可定义,并将字串倒序显示,如
把0123456789作为基准的字串字符表,产生一个6位的字串642031,打印出的字串为
130246,可使用bash/perl/php/c任意一种.

5.如何查看当前Linux系统的状态,如CPU使用,内存使用,负载情况等.

6.你在大学中做的最成功的一件事是什么(不必一定与计算机相关)


面试过程大概如下:

1、介绍一下项目。

2、提了一个问题:上千万条记录,统计出重复记录最多的前N条。

3、一个概率题:54张扑克牌,除去两张大小王剩下52张扑克牌。问红桃A和黑桃A同时被一个人拿到的概率是多少?

4、多个线程访问共享内存时因该怎么办?

5、在写程序遇到问题的时候,通常采用什么调试方法?

6、一个client/server的协议问题

7、剩下就是随便聊聊,比如有缺点、期望工作的性质、职业规划等

百度电话面试题目:
1.谈谈你对数据库中索引的理解
2.现在普通关系数据库用得数据结构是什么类型的数据结构
3.索引的优点和缺点
4.session和cache的区别是什么
5.如果有几千个session,怎么提高效率

6.session是存储在什么地方,以什么形式存储的。

 

=============================================================================

 

 

 

1、以下符号在LINUX下代表什么文件:p , l, c, d, s, -, MS很基本,不过我对LINUX一点
也不感冒!!(结果我瞎写的,如果有计算机的同学想拍我,一定在站内信箱拍!!)
   b 块设备文件
 
   c 字符设备文件
 
   d 目录文件
 
   p 命名管道( FIFO
 
   f 普通文件
 
   l 符号链接文件( symbolic links
 
   s socket 文件
2、编写一个SHELL脚本,保存目录中的文件,并存为.bak文件。(结果还是不会)
 
3、怎样在LINUX下测试网络状态。不会!
Netstat
4、在LINUX下怎样查询CPU,内存,硬盘的状态。不会!
Top
Fdisk -l
5、HTTP:?网络状态下的常见码状态是什么? 不会!
 
6、写结果:
void fun(char *temp,int n)
{
    char *s1,*s2;
    int t;
    int i =0;
    s1=temp;
    s2=s1+n-1;
    while(i++<7)
    {
       t=*s1++;
       *s1=*s2--;
       *s2=t;
    }
}
void main()
{
    char p[8]="1234567";
    fun(p,strlen(p));
    puts(p);
}
 
题目还有问题,结果估计是 1111111
 
还有一些我答上来了!你猜是什么题?
7、为何申请百度?百度成功在与什么?
 
8、怎样才能成为优秀的测试工程师?
 
9、这类题都可以自己想,我就不多说了!!
 
最后,说一下,为何30秒就挂了!!!^_^....
 
她一进门,拿者我的简历,之后对我说,你毕业比较晚,是吧?
我说“是”,今年才考上研,得08年才能毕业。
之后,她又说,你打算实习几个月,我说“二个月吧”。这时,她笑了笑,对我说:“着业
太短了,我们要求尽可能长时间的实习,且,主要面向即将毕业的同学,你看。。。”
这下每戏了,后来我们简短的谈了一下,之后就走了。(她比较和蔼,临走的时候,给我很
好的印象)。
 
值得一体的是,我笔试在“采云归”房间,就我一个人,笔试过程中,哪个为我登记的
PPMM给我那杯水,之后,见屋子里的两个椅子多余,就将它们抬了出去(比较费力),我当
时,被笔试弄晕了,早知道,我就帮她一起抬了^_^!!!如果有高手看到的话,请支一下招,
告诉小弟以后遇到这种事情该怎么办??顺便问一下,以后,我和这个MM还有戏吗???
 
回来后受打击了,正巧房东养了4个小王八,于是我开始玩王八解闷。。。
 
1.实现 void delete_char(char * str, char ch);
 把str中所有的ch删掉
  void delete_char(char * str, char ch)
{
    char *newstr = (char *)malloc(strlen(str)+1);
    char *str_p = str;
    char *newstr_p = newstr; // 如果没有这两个的话, while 后面的指针就出错了
    while(*str_p)
    {
       if(*str_p == ch)
           str_p++;
       else
           *newstr_p++ = *str_p++;
    }
    *newstr_p = '/0';
    strcpy(str, newstr);
    free(newstr);
}
2.把字符串S中所有A子串换成B,这个没给函数原型
 
3.搜索引擎的日志要记录所有查询串,有一千万条查询,不重复的不超过三百万
 要统计最热门的10条查询串. 内存<1G. 字符串长 0-255
 (1) 主要解决思路 //具体用词和原题不大一样
 (2) 算法及其复杂度分析
 
4.有字典,设计一个英文拼写纠正算法 (1) 思想 (2) 算法及复杂度 (3) 改进
 
5. { aaa, bb, ccc, dd }, { bbb, ff }, { gg } 等一些字符串的集合
 要求把交集不为空的集合并起来,如上例会得到 { aaa, bb, ccc, dd, ff }, {gg}
(1)    思想 (2) 算法及复杂度 (3) 改进
 
下午去百度笔试,考题有二叉搜索树和堆
 
1。编程:
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
 
void revert(char * str)
{
    int length = strlen(str);
    char temp;
    for(int i = 0; i < length/2; i++)
    {
       temp = *(str + i);
       *(str + i) = *(str + length - 1 - i);
       *(str + length - 1 - i) = temp;
    }
}
2 。编程:
                  用C语言实现函数void * memmove(void *dest,const void *src,size_t  n)。memmove
                  函数的功能是拷贝src所指的内存内容前n个字节 到dest所指的地址上。
/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void * memmove(void * dest,const void *src,size_t count)
{
    char *tmp, *s;
 
    if (dest <= src) {//dest 在前面,故 dest 头不可能覆盖 src
       tmp = (char *) dest;
       s = (char *) src;
       while (count--)
           *tmp++ = *s++;
    }
    else {//dest 在后面, dest 头可能覆盖 src 尾,造成 src 没有结束符
        tmp = (char *) dest + count;
       s = (char *) src + count;
       while (count--)
           *--tmp = *--s;
    }
 
    return dest;
}
3 英文拼写纠错:
                  在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包含了正确英文单词的词典,请你设计一个拼写纠错的程序。
                  (1)请描述你解决这个问题的思路;
                  (2)请给出主要的处理流程,算法,以及算法的复杂度;
                  (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
                  (1) 思路 :
                  
字典以字母键树组织,在用户输入同时匹配

                  (2)
                  
流程 :
                  
每输入一个字母:
                  
沿字典树向下一层,
                  a
)若可以顺利下行,则继续至结束,给出结果;
                  b)
若该处不能匹配,纠错处理,给出拼写建议 , 继续至 a );
                   算法 :
                  1.
在字典中查找单词
                  
字典采用 27 叉树组织 , 每个节点对应一个字母 , 查找就是一个字母
                  
一个字母匹配 . 算法时间就是单词的长度 k.
                  2. 纠错算法
                  
情况 : 当输入的最后一个字母不能匹配时就提示出错 , 简化出错处理,动态提示
                  
可能 处理方法 :
                  (a)
当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;
                  (b)
当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可
                   以有更多的)
                  
根据分析字典特征和用户单词已输入部分选择 (a),(b) 处理

                  
复杂性分析:影响算法的效率主要是字典的实现与纠错处理
                  
a )字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
                  (b)
纠错策略要简单有效 , 如前述情况,是线性复杂度;
                  (3) 改进
                  
策略选择最是重要,可以采用统计学习的方法改进。
 4 寻找热门查询:
                  搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串
                  的长度为1-255字节。假设目前有一千万个记录,
                  这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
                  。一个查询串的重复度越高,说明查询它的用户越多,
                  也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
                  (1)请描述你解决这个问题的思路;
                  (2)请给出主要的处理流程,算法,以及算法的复杂度。
1G就是十亿
         (1) 思路:
                  
用哈希做
                  (2)
                  
首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度
                  
(注意值与日志项对应关系)
                  
选出前十的频度,取出对应的日志串,简单不过了。
                   哈希的设计是关键。
5 集合合并:
                  给定一个字符串的集合,格式如:
                  {aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
                  要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
                  输出
                  {aaa bbb ccc ddd hhh},{eee fff}, {ggg}
                  (1)请描述你解决这个问题的思路;
                  (2)请给出主要的处理流程,算法,以及算法的复杂度
                  (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。

        要求将其中交集不为空的集合合并
 
要求合并完成后的集合无交集
这两个要求只要 1 满足了, 2 就自然满足了。
 
方法 1 :把每个集合用 vector<vector<char> > 表示,比较两个集合里面 vector<char> 是否相等 ( 是否交集不为空,有相同元素 ) ,如果有相同集合就合并。这个就是每个集合都和其后面的集合比较,复杂度为 o(n2)
 
方法 2 :把每个集合都遍历一遍,找出所有集合的所有元素 ( 不重复 ). 然后建立一张表,记录各个元素在每个集合的出现情况,行代表元素,列代表集合,出现则相应位为 1 ,否则为 0 。表建立完成后,把每行有多个 1  1 所在列的集合合并就可以了。
 
时间复杂度: 遍历 O(n), 写表 O(n), 最后查表合并 o(n) ,总的复杂度为 O(n)           
 
Map的用法
    map<string ,int> a;
    string b("asdf");
    a.insert(map< string,int >::
       value_type(b,3));
    string c("sdf");
    a.insert(map< string,int >::
       value_type(c,4));
    map<string, int>::iterator i;
    for(i = a.begin(); i != a.end(); i++)
       cout << (*i).first << " " << (*i).second << endl;
    a.erase(b);
    for(i = a.begin(); i != a.end(); i++)
       cout << (*i).first << " " << (*i).second << endl;
 
我的方法:
先遍历集合,建立一个 hash 表, hash 表的键为集合中的字符串,值表示为包含此字符串的集合的序号,比如说集合 1 3 包含此元素,值就是 00001010 ,复杂度为 o n
然后遍历这个 hash 表,将这些值进行 & 运算,结果为 0 时就跳过,结果不为 0 时保存此结果,然后从 hash 表中删除这个条目,遍历完一遍后得到第一个合并后的集合的序号,就进行合并。此为 o(m)
然后再次遍历直到 hash 表为空为止。复杂度合并后集合数乘上 hash 表长度
其实也可以通过一次遍历 hash 表来确定,建立一个链表, a[0] 为保存 & 不为 0 的值, a[1] 保存 & 0 的值,然后将 a[] 中的数字都与 hash 表的值做 & 运算,都为 0 时将这个值加入链表,不为 0 时,将结果保存到 a[i] ,有可能还要合并,不过这样复杂度也不好算
 “已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写C语言函数实现从中去掉所有ansi编码的的数字和字母(包括大小写).要求在原字串上返回结果。int filter_ansi(char* gbk_string);注:汉字的GBK编码范围是0x8140 - 0xFEFE。”
 
char * filter_ansi(char* gbk_string)
{
    assert(gbk_string!=NULL);
    char *src;
    char *dst;
    src = dst = gbk_string;
    while(*src)
    {
       if(*src & 0x80)
       {
           *dst++ = *src++;
           *dst++ = *src++;
       }
       else
           src++;
    }
    *dst = '/0';
    return gbk_string;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值