百度2013校园招聘题

第一题,基础题:
1. 数据库及线程产生死锁的原理和必要条件,如何避免死锁。
2. 列举面向对象程序设计的三个要素和五项基本原则。

解答:

封装,继承,多态
面向对象的五大基本原则
单一职责原则(SRP)
开放封闭原则(OCP) 
里氏替换原则(LSP) 
依赖倒置原则(DIP) 
接口隔离原则(ISP)单一职责原则(SRP)

3.Windows内存管理的方式有哪些?各自的优缺点。
第二题,算法与程序设计:
1.公司举行羽毛球比赛,采用淘汰赛,有1001个人参加,要决出“羽毛球最高选手”,应如何组织这次比赛?可以使用伪代码。

解答:

堆排序或者竞标赛排序。

2.有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的?

解答:

完全平方数。

3.有20个有序数组,每个数组有500个uint变量,降序排序。要求从这10000个元素中选出最大的500个。

解答:

可能是多路归并排序思想,用到了堆,使用了优先队列数据结构

  1. #include <iostream>   
  2. #include <cstdlib>   
  3. #include <algorithm>   
  4. #include <queue>   
  5. using namespace std;  
  6.   
  7. #define ROWS 20   
  8. #define COLS 500   
  9.   
  10. int data[ROWS][COLS];  
  11.   
  12. void CreateData()  
  13. {  
  14.     for(int i=0; i<ROWS; i++)  
  15.     {  
  16.         for(int j=0; j<COLS;j++)  
  17.         {  
  18.             data[i][j] = rand();                         //生成随机元素   
  19.         }  
  20.     }  
  21.     forint i=0; i<ROWS; i++)  
  22.         sort(data[i],data[i]+COLS, greater<int>());     //对每一行降序排列   
  23. }  
  24.   
  25. struct Node   
  26. {  
  27.     int *p;  //指向某个列,因为要放入优先队列中,所以要比较大小,就用结构体封装了下   
  28.     bool operator<(const struct Node &node) const  
  29.     {  
  30.         return *p < *node.p;  
  31.     }  
  32. };  
  33.   
  34. void OutMinData( int k)  
  35. {  
  36.     struct Node arr[ROWS];  
  37.     for(int i=0; i<ROWS;i++)  
  38.     {  
  39.         arr[i].p = data[i];                       //初始化指针指向各行的首位   
  40.     }  
  41.     priority_queue<Node > queue( arr, arr+ROWS );  //使用优先队列,默认是大堆   
  42.   
  43.     forint i=0; i<k&&i<COLS; i++)                //算法核心就是这个循环   
  44.     {  
  45.         Node temp = queue.top();                   //取出队列中最大的元素   
  46.         cout << *temp.p << " " <<endl;              
  47.         queue.pop();                               //从队列里删除       
  48.         temp.p++;                                  //对应行的指针后移   
  49.         queue.push( temp );                        //这里面有log(ROWS)次操作,所以算法的总复杂度为O(klog(20))   
  50.     }  
  51.       
  52. }  
  53.   
  54. int main()  
  55. {  
  56.     CreateData();  //生成数据   
  57.     int k=500;  
  58.     OutMinData( k ); //输出k个元素,这里k不要大于列数COL,可以改进,去掉这个限制,不过会让程序不好懂,就没加   
  59. }  
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;

#define ROWS 20
#define COLS 500

int data[ROWS][COLS];

void CreateData()
{
    for(int i=0; i<ROWS; i++)
    {
        for(int j=0; j<COLS;j++)
        {
            data[i][j] = rand();                         //生成随机元素
        }
    }
    for( int i=0; i<ROWS; i++)
        sort(data[i],data[i]+COLS, greater<int>());     //对每一行降序排列
}

struct Node 
{
    int *p;  //指向某个列,因为要放入优先队列中,所以要比较大小,就用结构体封装了下
    bool operator<(const struct Node &node) const
    {
        return *p < *node.p;
    }
};

void OutMinData( int k)
{
    struct Node arr[ROWS];
    for(int i=0; i<ROWS;i++)
    {
        arr[i].p = data[i];                       //初始化指针指向各行的首位
    }
    priority_queue<Node > queue( arr, arr+ROWS );  //使用优先队列,默认是大堆

    for( int i=0; i<k&&i<COLS; i++)                //算法核心就是这个循环
    {
        Node temp = queue.top();                   //取出队列中最大的元素
        cout << *temp.p << " " <<endl;            
        queue.pop();                               //从队列里删除    
        temp.p++;                                  //对应行的指针后移
        queue.push( temp );                        //这里面有log(ROWS)次操作,所以算法的总复杂度为O(klog(20))
    }
    
}

int main()
{
    CreateData();  //生成数据
    int k=500;
    OutMinData( k ); //输出k个元素,这里k不要大于列数COL,可以改进,去掉这个限制,不过会让程序不好懂,就没加
}

4.  字符串左移, void *pszStringRotate(char *pszString, intnCharsRotate), 比如 ABCDEFG ,移 3 位变 DEFGABC ,要求空间复杂度 O 1 ),时间复杂度 O n
  1. #include <iostream>   
  2. using namespace std;  
  3.   
  4. void ReverseString( char* pBegin, char* pEnd ){  
  5.   
  6.     while( pBegin < pEnd ){  
  7.         char ch = *pBegin;  
  8.         *pBegin++ = *pEnd;  
  9.         *pEnd-- = ch;  
  10.     }  
  11. }  
  12.   
  13. char *pszStringRotate(char *pszString, int nCharsRotate){  
  14.     char * end = pszString;  
  15.     while( *end++ );  
  16.     end = end-2;  
  17.     if( pszString + nCharsRotate -1 > end ) return NULL;  
  18.     ReverseString( pszString, pszString+nCharsRotate-1);  
  19.     ReverseString( pszString+nCharsRotate, end);  
  20.     ReverseString( pszString, end);  
  21.     return pszString;  
  22. }  
  23.   
  24. int main(){  
  25.     char str[] = "ABCDEFG";  
  26.     char *s = pszStringRotate( str, 3 );  
  27.     if( s )  
  28.         cout << s <<endl;  
  29.     return 0;  
  30. }  
#include <iostream>
using namespace std;

void ReverseString( char* pBegin, char* pEnd ){

	while( pBegin < pEnd ){
		char ch = *pBegin;
		*pBegin++ = *pEnd;
		*pEnd-- = ch;
	}
}

char *pszStringRotate(char *pszString, int nCharsRotate){
	char * end = pszString;
	while( *end++ );
	end = end-2;
	if( pszString + nCharsRotate -1 > end ) return NULL;
	ReverseString( pszString, pszString+nCharsRotate-1);
	ReverseString( pszString+nCharsRotate, end);
	ReverseString( pszString, end);
	return pszString;
}

int main(){
	char str[] = "ABCDEFG";
	char *s = pszStringRotate( str, 3 );
	if( s )
		cout << s <<endl;
	return 0;
}


第三题,系统设计题:
手机数字键上有拼音字母,一个数字串对应着多个字母序列,如2--ABC,6--MNO,9--WXYZ,则926对应着WAN,YAN,是汉字“万”、“艳”的拼音等。要求设计一个系统,输入是联系人列表UserList<UserName, PhoneNo>,汉字字母映射Dict,数字串NumStr,输出满足下列条件的联系人列表ResultList<UserName, PhoneNo>:
(1)输入一个数字串,输出与其部分连续匹配的所有手机号,如,输入926,输出13926118288
(2)输入一个数字串,输出与其部分连续匹配的所有联系人姓名拼音,如输入926,输出“李万”,“李艳”等

解答:

1,字典树

2,哈希表


2.2的解答:

http://gzcsl.blog.163.com/blog/static/4103020088244441761/

这道题让人一看觉着非常有趣,但又让人感觉很复杂,其实这道题,只要弄清三点,问题就迎刃而解了。
1.对于每盏灯,拉动的次数是奇数时,灯就是亮着的,拉动的次数是偶数时,灯就是关着的。
2.每盏灯拉动的次数与它的编号所含约数的个数有关,它的编号有几个约数,这盏灯就被拉动几次。
3.1——100这100个数中有哪几个数,约数的个数是奇数。我们知道一个数的约数都是成对出现的,只有完全平方数约数的个数才是奇数个。

所以这100盏灯中有10盏灯是亮着的。
它们的编号分别是: 1、4、9、16、25、36、49、64、81、100。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值