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

原题链接:点这儿.

1、一个C语言程序在一台32位机器上运行。程序中定义了三个变量x, y, z,其中xz是int型,y为short型。当x=127,y=-9时,执行赋值语句z=x+y后,x, y, z的值分别是

  • x=0000007FH,y=FFF9H,z=00000076H
  • x=0000007FH,y=FFF9H,z=FFFF0076H
  • x=0000007FH,y=FFF7H,z=FFFF0076H
  • x=0000007FH,y=FFF7H,z=00000076H

D.
计算机中表示数据都是用补码表示的,那么如何快速求补码呢?先写出该数对应的二进制原码,然后从右往左找到第一个1,这个1左边的二进制全部取反,符号位不变,右边的二进制不变y的二进制原码为1000000000001001,得到补码为1111111111110111,即FFF7H,依次可得x的补码为0000007FHz=x+y=118,补码为00000076H

2、关于进程状态的说法,下列错误的是

  • 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态变为执行状态
  • 当前进程因发生某事件而无法执行,如访问已被占用的临界资源,就会使进程由执行状态转变为阻塞状态
  • 当前进程因时间片用完而被暂停执行,该进程便由执行状态转变为阻塞状态
  • 处于挂起状态的进程不能接收处理机调度

C.
要分清楚阻塞状态和就绪状态的导致原因是什么。阻塞状态的原因是当前进程得不到除CPU之外的资源而导致等待的一种状态;就绪状态的原因是当前进程得不到CPU而导致等待的一种状态。很明显,C选项是因为得不到CPU,所以该进程由执行状态变为就绪状态。

3、同一进程下的线程不可以共享的是

  • stack
  • data section
  • code section
  • file fd

A.
同一进程下的进程由自己独立的栈空间,因此不可以共享栈段;

  • 线程可以共享的资源:
    • 地址空间
    • 全局变量
    • 打开的文件
    • 子进程
    • 信号及信号服务程序
  • 线程不可以共享的资源:
    • PC的值
    • 寄存器
    • 栈段
    • PSW的值

4、在OSI 7 层模型中,网络层的功能有

  • 确保数据的传送正确无误
  • 确定数据包如何转发与路由
  • 在信道上传送比特流
  • 纠错与流控

B.
AD是数据链路层的功能;C选项是物理层的功能;B选项是网络层的功能。

5、应用程序PING 发出的是什么报文

  • TCP 请求报文
  • TCP 应答报文
  • ICMP 请求报文
  • ICMP 应答报文

C.
Ping命令工作在应用层,直接使用网络层的ICMP协议,而没有使用传输层的TCP或UDP协议,traceroute工作在网络层 ;Ping命令测试两个主机之间的连通性,traceroute用来跟踪分组经过的路由。

6、使用traceroute命令测试网络时可以

  • 检验链路协议是否运行正常
  • 检验目标网络是否在路由表中
  • 检验应用程序是否正常
  • 显示分组到达目标路径上经过的各路由器

D.
见上一题的解析。

7、主机甲向主机乙连续发送了两个TCP报文段,其序号分别为70和100。下列错误的是

  • 第一个报文段携带了30个字节的数据
  • 主机乙收到第一个报文段后发回的确认中的确认号是100
  • 如果主机乙收到第二个报文段后发回的确认中的确认号是180,那么甲发送的第二个报文段中的数据有80字节
  • 如果甲发送的第一个报文段丢失了,但第二个报文段到达了乙,乙在第二个报文段到达后向甲发送确认,这个确认号为100

D.
TCP协议的确认机制是累积确认,当且仅当前面的所有数据都正确收到时,接收方才会发送下一个期望收到的数据包的序号

8、在单链表中删除指针p所指结点的后继结点,则执行什么操作

  • p->next=p->next->next
  • p->next=p->next
  • p=p->next->next
  • p=p->next;p->next=p->next->next

A.
A选项是正确的做法;
B选项不知道在干什么;
C选项是令当前结点指向当前结点的下下个结点;
D选项删除了指正p指向结点的后续结点的后续结点。

9、表达式(a-b)*(c+5)的后缀式是

  • a b c 5 + * -
  • a b – c + 5 *
  • a b c - * 5 +
  • a b - c 5 + *

D.
考察后缀表达式的处理。
如何求后缀表达式:设立一个符号栈s;扫描表达式,遇到数字和变量直接照写,遇到操作符则和栈顶的操作符进行比较,如果当前操作符级别大于栈顶操作符,则将当前操作符入栈,如果当前操作符级别小于或等于栈顶操作符,那么对s执行出栈操作,直到当前操作符级别大于栈顶操作符,然后将当前操作符入栈;还要注意,遇到左括号则无条件入栈,虽然左括号优先级最低,遇到右括号则对s进行出栈操作,直到遇到左括号为止;最后将栈中的操作符一次出栈,这样后缀表达式就求完了。

10、堆是一种数据结构,下面哪一个是堆

  • (10,50,80,30,60,20,15,18)
  • (10,18,15,20,50,80,30,60)
  • (10,15,18,50,80,30,60,20)
  • (10,30,60,20,15,18,50,80)

B.
堆采用完全二叉树存储,故把数组写成二叉树的形式,然后判断下是否符合大根堆和小根堆就行了。

11、略。

12、略。

13、编程题:读入一个字符串str,输出字符串str中的连续最长的数字串

#include 

using namespace std;

int main()
{
    string str;
    cin >> str;
    str += "a";
    int ans_src, ans_des, ans_len = 0;
    for (int i = 0, src = 0, des = 0; i < (int)str.size(); i++) {
        if (isdigit(str[i]))
            des = i + 1;
        else {
            if (ans_len < des - src) {
                ans_len = des - src;
                ans_src = src;
                ans_des = des;
            }
            src = des = i + 1;
        }
    }
    cout << str.substr(ans_src, ans_len) << endl;
    return 0;
}

14、编程题:找出n个数里最小的k

#include 

using namespace std;

int main()
{
    vector<int> arr;
    int x;
    while (cin >> x)
        arr.push_back(x);
    sort(arr.begin(), arr.end() - 1);
    for (int i = 0; i < arr[arr.size() - 1]; i++)
        cout << arr[i] << (i == arr[arr.size() - 1] - 1 ? "\n" : " ");
    return 0;
}

15、编程题:输入n个整数,输出出现次数大于等于数组长度一半的数。

设置一个哨兵,遍历数组,遇到和哨兵不一样的值,使哨兵的数量减一;如果一样,使其数量加一;如果哨兵的数量为0,则设置当前元素为新的哨兵,最后由于保证一定有解,于是就直接输出哨兵就行了,如果不保证有解,那么最后还要遍历一遍数组,判断下哨兵到底是不是解。

#include 

using namespace std;

int main()
{
    vector<int> arr;
    int x;
    while (cin >> x)
        arr.push_back(x);
    int tag = arr[0], cnt = 1;
    for (int i = 1; i < arr.size(); i++)
        if (tag == arr[i])
            ++cnt;
        else if (cnt > 0)
            --cnt;
        else
            tag = arr[i], cnt = 1;
    cout << tag << endl;
    return 0;
}

16、略。

你可能感兴趣的:(笔试面试题,笔试面试题)