好未来2017秋招笔试真题二 - 解析

原题链接:点这儿.

1、请问下列关于构造函数的说法中,哪一种不正确?

  • 构造函数可以为const函数
  • 构造函数不能为虚函数
  • 默认构造函数不会初始化复合类型成员变量
  • 类的成员变量在构造函数中初始化

A
const修饰的函数不能修改成员变量,而构造函数就是要初始化成员变量,显然矛盾。

2、请问:printf("%d %d", *(--ptr), *(++ptr))语句中,首先进行哪个运算?

  • --ptr
  • ++ptr
  • 同时计算--ptr++ptr
  • 随机顺序计算--ptr++ptr

B
方法中的参数都是从右到左执行的。执行下下面这个代码知道了。

#include <bits/stdc++.h>

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),则由这组记录关键字生成的二叉排序树的深度为()

  • 4
  • 5
  • 6
  • 7

D
考察二叉排序树的构建。

7、已知数据表A中每个元素距其最终位置不远,为节省时间,应该采用的算法是

  • 直接选择排序
  • 堆排序
  • 快速排序
  • 直接插入排序

D
首先考虑选择排序,如果每一趟排序都要走到底才能选出最小的元素;其次是堆排序,堆排序每次都把“最后的元素”和堆顶元素交换,然后调整堆;快速排序选择一个元素为基准,把序列划分成两个部分,递归下去。插入排序是用当前元素去插入有序序列来得到整体有序。

如果序列每个元素距其最终位置不远,插入排序每次都不用移动太多元素,故插入排序最快。

8、对某二叉树进行前序遍历的结果是ABDEFC,中序遍历的结果是DBFEAC,则后序遍历的结果是

  • BDFECA
  • DBFEAC
  • DFEBCA
  • BDEFAC

C
字符A是根结点,故在后序遍历中应该位于最后,中序遍历序列中在字符A的左边是DBFE为左子树,字符C是右子树,得到后序遍历的最后两个字符是CA,对(BDEF)DBFE执行上述相同的操作,得到字符B是左子树的根,应该放在最后,故得到后序遍历的最后两个字符是BCA,所以选C。

9、算法的时间复杂度是指

  • 执行算法程序所需要的时间
  • 算法程序的长度
  • 算法执行过程中所需要的基本运算次数
  • 算法程序中的指令条数

C
概念题。

10、连续扔一枚硬币,前10次为正面,请问第11次也为正面的概率是多少?

  • 1/2048
  • 大于1/2
  • 1/2
  • 小于1/2

这题有问题,条件不足,你怎么解释都可以。

11、略。

12、略。

13、编程题:将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

#include <bits/stdc++.h>

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 <bits/stdc++.h>

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 <bits/stdc++.h>

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、略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值