第一题,基础题:
1. 数据库及线程产生死锁的原理和必要条件,如何避免死锁。
2. 列举面向对象程序设计的三个要素和五项基本原则。
解答:
封装,继承,多态
第二题,算法与程序设计:
1.公司举行羽毛球比赛,采用淘汰赛,有1001个人参加,要决出“羽毛球最高选手”,应如何组织这次比赛?可以使用伪代码。
解答:
堆排序或者竞标赛排序。
解答:
完全平方数。
解答:
可能是多路归并排序思想,用到了堆,使用了优先队列数据结构
#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 )
#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。