c/c++程序员应聘面试题

来源:互联网 发布:淘宝国际中转站 编辑:程序博客网 时间:2024/06/06 02:01

1. 求二个集合A、B交集的补集。
以整型集合为例。
set<int> f(set<int> A, set<int> B)
{
set<int>C(A);
pair<set<int>::iterator, bool> ele;
for (set<int>::iterator iter=B.begin(); iter!=B.end(); iter++)
{
ele = C.insert(*iter);
if (!ele.second)
C.erase(*iter);
}
return C;
}
这个不够高效,要做参数的复制,及返回时的临时对象,下面的更加好:
void f(const set<int>& A, const set<int>& B, set<int>& C)
{
C = A;
pair<set<int>::iterator, bool> ele;//用于存放插入元素是否成功
for (set<int>::const_iterator iter=B.begin(); iter!=B.end(); iter++)
{
ele = C.insert(*iter);
if (!ele.second)//如果插入失败,说明是交集元素,将它删除。
C.erase(*iter);
}
}



2. 输入一行字符,求英文字母,数字,空格,其它字符的个数。
一个有用的string IO操作:getling。这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到 string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个 字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。
getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。

#include <iostream>
#include <string>
using namespace std;
int main()
{
int letter = 0;
int number = 0;
int space = 0;
int other = 0;
string line;
getline(cin, line);
int len = line.length();
for (int i=0; i<len; i++)
{
if ((line[i]<=’z’ && line[i] >=’a') || (line[i]<=’Z’ && line[i]>=’A') )//rong:line[i]下标访问
letter++;
else if (line[i]<=’9′ && line[i]>=’0′)
number++;
else if (line[i] == ‘ ‘)
space++;
else
other++;
}
cout << “letter: ” << letter << endl;
cout << “number: ” << number << endl;
cout << “space: ” << space << endl;
cout << “other: ” << other << endl;
}



3. 判断一个数是否是2的乘方
可以用移位运算.如果是2的乘方,那应该只有最左的一个是1。从右向左找,找到第一个1时停止,记录下移了多少位n,那2的n次方如果和原来的数相等,那么这个数就是2的乘方,否则不是。
之前以为移位是直接到数本身的操作,原来不是,它操作是给出一个移位后的返回值,而操作数本身没有改变。
bool judge(int number)
{
if (number == 0)//这里不能少,否则输入0的话,会进入死循环。
return false;
int n = 0;
int copy = number;
while ((copy&1) == 0)//如果copy&1 == 1,说明找到了最靠右的1。
{
cout << copy << endl;
n++;
copy = copy >> 1;//这里不能用copy>>1,这样copy没有变化,死循环。
}
return !(number&~(1<<n)); //如果1左移n位与原数不相等,说明原数不止一个1,不是2的n次方。

}


4. 判断一个数是不是奇数
return number&1;


5. 求数组数字的全排列
转自:http://tieba.baidu.com/f?kz=478333827
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。


(1)、首先看最后两个数4, 5。 它们的全排列为4 5和5 4,即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。

(2)、 再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4、5的全排列的组合、以4开头的和3、5的全排列的组合和以5开头的和3、4的全排列的组合。从而可以推断,设一组数p = {r1, r2, r3, … ,rn},全排列为perm(p),pn = p – {rn}。因此perm(p) = r1perm(p1)、r2perm(p2)、 r3perm(p3)、 …、rnperm(pn)。当n = 1时perm(p} = r1。

为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

算法如下:

#include <stdio.h>

int n = 0;

void swap(int *a, int *b) // 交换
{
int m;
m = *a;
*a = *b;
*b = m;
}

void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf(“%d “, list[i]);
printf(“\n”);
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}

int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf(“total:%d\n”, n);
return 0;
}

0 0
原创粉丝点击