原题链接:点这儿.
1、请问下列关于构造函数的说法中,哪一种不正确?
A
const修饰的函数不能修改成员变量,而构造函数就是要初始化成员变量,显然矛盾。
2、请问:printf("%d %d", *(--ptr), *(++ptr))
语句中,首先进行哪个运算?
--ptr
++ptr
--ptr
,++ptr
--ptr
,++ptr
B
方法中的参数都是从右到左执行的。执行下下面这个代码知道了。
#include
void fun(int a, int b)
{
cout << a << " " << b << endl;
}
int fun1()
{
cout << 1 << endl;
return 1;
}
int fun2()
{
cout << 2 << endl;
return 2;
}
int main()
{
fun(fun1(), fun2());
return 0;
}
3、V原语对信号量做运算后,( )
S<0
时进程继续执行S<0
时要唤醒一个就绪进程S≤0
时要唤醒一个等待进程 S≤0
时要唤醒一个就绪进程C
P操作和V操作都是对信号量先自减和自增,也就是说,我们对S
进行还原一下就可以得出PV之前资源的情况;这题是V操作,我们对S
减一,如果发现S
的值为负数,说明等待队列中有等待的进程,故要唤醒一个等待进程,那么S≤0
是满足条件的。
4、虚拟内存的容量只受( )的限制
D
虚拟内存的大小受计算机地址位数和磁盘空间大小加主存大小共同限制。这个题其实是有点问题的。
5、设带有头结点的单向循环链表的头指针变量为head,则其判空条件是( )
head==0
head->next==0
head->next==head
head!=0
C
6、设有一组初始记录关键字序列为(34,76,45,18,26,54,92)
,则由这组记录关键字生成的二叉排序树的深度为()
D
考察二叉排序树的构建。
7、已知数据表A中每个元素距其最终位置不远,为节省时间,应该采用的算法是
D
首先考虑选择排序,如果每一趟排序都要走到底才能选出最小的元素;其次是堆排序,堆排序每次都把“最后的元素”和堆顶元素交换,然后调整堆;快速排序选择一个元素为基准,把序列划分成两个部分,递归下去。插入排序是用当前元素去插入有序序列来得到整体有序。如果序列每个元素距其最终位置不远,插入排序每次都不用移动太多元素,故插入排序最快。
8、对某二叉树进行前序遍历的结果是ABDEFC,中序遍历的结果是DBFEAC,则后序遍历的结果是
C
字符A是根结点,故在后序遍历中应该位于最后,中序遍历序列中在字符A的左边是DBFE为左子树,字符C是右子树,得到后序遍历的最后两个字符是CA,对(BDEF)DBFE执行上述相同的操作,得到字符B是左子树的根,应该放在最后,故得到后序遍历的最后两个字符是BCA,所以选C。
9、算法的时间复杂度是指
C
概念题。
10、连续扔一枚硬币,前10次为正面,请问第11次也为正面的概率是多少?
这题有问题,条件不足,你怎么解释都可以。
11、略。
12、略。
13、编程题:将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
#include
using namespace std;
int main()
{
stack<string> st;
string str;
while (cin >> str)
st.push(str);
cout << st.top();
st.pop();
while (!st.empty())
cout << " " << st.top(), st.pop();
cout << endl;
return 0;
}
14、编程题:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
#include
using namespace std;
int main()
{
vector<string> arr;
string str;
while (cin >> str)
arr.push_back(str);
set<char> st;
for (auto c : arr[arr.size() - 1])
st.insert(c);
for (int i = 0; i < arr.size() - 1; i++) {
for (auto c : arr[i])
if (st.find(c) == st.end())
cout << c;
i == arr.size() - 2 ? cout << endl : cout << " ";
}
return 0;
}
15、编程题:输入两个整数 n 和 m,从数列1,2,3…….n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
深搜一下就行,我的代码写得很挫,
used
数组其实是不需要的。
#include
using namespace std;
void dfs(int n, int m, vector<bool> &used, vector<int> &ans, int len, int start)
{
if (m == 0) {
for (int i = 0; i < len; i++)
cout << ans[i] << (i == len - 1 ? "\n" : " ");
return ;
}
for (int i = start; i <= n; i++)
if (!used[i] && i <= m) {
used[i] = true;
ans[len] = i;
dfs(n, m - i, used, ans, len + 1, i);
used[i] = false;
}
}
int main()
{
int n, m;
cin >> n >> m;
vector<bool> used(n + 1, false);
vector<int> ans(n + 1);
int len = 0;
dfs(n, m, used, ans, len, 1);
return 0;
}
16、略。