C++开发笔试真题

单选

1·关于斐波那契数列的这段代码时间复杂度?(O(n))

def fib(n):
    if(n<=1);//0,1直接返回
        return n;
    fibs=[0]*(n+1);//初始化一个数组
    fibs[1]=1;
    for i in range(2,n+1);//从下标为2的数字开始
        fibs[i]=fibs[i-1]+fibs[i-2];
    return fibs[n];//返回第n个数字

2·关于Linux系统,描述错误的是?

  • A:etc主要存放配置文件,启动脚本等

  • B:Linux主要分内核、shell、文件系统和应用程序

  • C:Linux是内核目前尚无法脱离界面运行 可以脱离界面运行

  • D:bin目录下主要放置一些系统必备的执行文件

3·❓输出正确的结果 9

using namespace std;
//考察内存对齐
struct  TEST{
    char t_a;
    char t_b;
    int t_c;
    char t_d;
};
int main()
{
    int a[3][5]={
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    };
    int num=a[1][sizeof (TEST)/4];
    cout<<num;
    return 0;
}
//9
//test的大小为12

test的大小为12–结构体对齐的规则是什么?

4·在编译系统中,语法分析程序输出的是—语法分析树

  • 四元式
  • 表达式
  • 语法分析树
  • 句子
**编译过程分为:==编译预处理(.ii文件)、编译(.s)、汇编(.o)、链接==**

1. 编译预处理:生成.ii文件

   1. 处理以#开始的预编译指令、如#include、#define
   2. 删除注释行、删除define,展开宏定义
   3. 添加行号和文件名标识-便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号

2. 编译:–进行一系列的词法分析\语法分析\语义分析\优化后产生相应的汇编代码文件

   1. 词法分析-将源代码的字符分割成一系列的记号
   2. 语法分析-对词法分析后的记号-进行语法分析-从而形成语法树
   3. 语义分析
      1. 静态语义:编译时可以确定的语义
      2. 动态语义:只有在运行时才能确定的语义-C++中的多态-virtual的虚函数与虚表指针❓
   4. 中间语言生成-源码优化器-对代码进行优化:2+6直接优化成8
   5. 目标代码生成与优化

3. 汇编:

   1. 将汇编代码转化成机器可以执行的指定.o

4. 链接:-生成可执行文件

   1. 地址和空间分配
   2. 符号决议
   3. 重定位

   **静态链接:复制和拷贝一份所需要的内容**==效率高-耗内存==

   **动态链接:保存其对应的地址-运行时进行寻址**==开销小-速度慢==

5·❓网段地址154.27.0.0的网络,若不做子网划分,能支持几台主机?(B)

A:1024
B:65534
C:254
D:16777206

6·❓关于HTTP协议下面描述正确的是 (D)

A:HTTP协议是有状态的  无状态
B:HTTP协议默认的端口号是8080    80
C:HTTP协议中只能通过post方法向服务器上传资源  post get也可以
D:HTTP协议是以ASCAII码传输,建立在TCP/IP协议指上的应用层  头部用ASCAII 数据用二进制

7·关于排序算法描述错误的是-(A)

A:插入排序和快速排序的时间复杂度为O(1)
B:希尔排序的核心思路是序列分割成为若干子序列分别进行直接插入排序
C:虽然快速排序速度较高,但是考虑到空间复杂度、元素无序程度,代码风格等诸多元素,其它排序算法依然有其适用场景
D:冒泡排序的核心思路是比较相邻的元素,如果第一个比第二个大就交换
排序算法总结

xiVy4g.png

多选

1·下列说法正确的是?(AC)

A:在类的构造函数中不能够初始化静态成员变量
B:普通成员函数不可以访问静态成员变量
C:静态成员函数不能访问普通成员变量
D:静态成员在类的所有对象中是共享的

2·❓下列哪个方法可以用于创建一个可运行的类?(BD)

A:
public class X implements Runnable{
    protected void run(){.......}
};

B:
public class X implements Runnable{
    public void run(){.......}
};

C:
public class X extern Thread{
    protected void run(){.......}
};

D:
public class X implements Runnable{
    public void run(){.......}
};

3·OSI网络七层描述正确的是 ()

  • A:网络层:负责数据包从源到宿的传递和网际互联(包PackeT)
  • B:物理层:通过媒介传输比特,确定机械及电器规范(比特Bit)
  • C:表示层:建立、管理和终止会话(会话协议数据单元SPDU)
  • D:会话层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
OSI七层网络模型
  1. 物理层
    • 机械、电子、定时接口通信、信道上的比特流传输
  2. 数据链路层
    • 物理寻址、同时将原始比特流转变为逻辑传输路线
  3. 网络层-IP
    • 控制子网的运行,如逻辑编址,分组传输、路由选择
  4. 传输层-TCP、UDP
    • 接受上一层的数据,在必须要的时候对数据进行分割,并将这些数据交给网络层,且保证这些数据有效达到对端
  5. 会话层
    • 不同机器上的用户直接建立管理和会话
  6. 表示层–加密解密、压缩、解压缩
    • 信息的语法语义以及它们的关联,如加密、解密、转化翻译、压缩和解压缩
  7. 应用层–HTTP、FTP
    • 各种应用程序协议

4·❓下列说法错误的是?

  • 高级编程语言编译程序常用的语法分析方法中,递归分析法属于自底而上的分析方法
  • “未定义符号”错误(Undefinded SymBol Error)一般发生在预编译阶段
  • 程序编译常常被设计成“前端”加“后端”的模式,有利于功能的移植和扩展
  • 与编译器相比,解释器能产生更快的程序

5·在软件工程中,关于单元测试的方法,如下选项正确的是?

  • 白盒测试又称功能测试,允许测试人员利用程序内部的逻辑结构及有关信息,设计或者选择测试用例,对程序所有逻辑进行测试

  • 静态测试可以通过人工分析来测试程序的正确性

  • 动态测试通过动态分析,程序测试等方法来检车和确认程序是否存在问题

  • 黑盒测试又称结构测试,不考虑成簇内部特性,只依据程序的需求规格说明做检测

白盒测试又称结构测试,

6·以下程序说法正确的是?

for(int i=0;i<2;i++){
    cout<<i+'b'+1;
}
  • 时间复杂度为O(1)
  • 时间复杂度为O(n)
  • 输出:0b11b1
  • 输出:99100

//b字符的ASCII码值为 98

时间复杂度和不受数值的变化是固定的所以是O(1)

编程题

1·手机运行时长

手机后台可以运行多个程序,假设当后台没有APP运行时,手机进入休眠,否则手机处于运行状态
第i个APP的开始运行时间为starti,运行结束时间为endi,组成第i个APP的运行区间为intvekis[i]=[starti,endi]
数组intvekis表示今天手机各个APP运行时间的区间的集合,求今天手机运行了多长时间
输入描述

输入所有APP的运行时间区间,每行都是一个APP运行区间starti和endi

输出描述

运行时间

样例
输入:
1 3
2 6
8 10
15 18
输出:
10
C++参考代码-仅供参考
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace  std;
int main(){
    int start;
    int end;
    vector<pair<int,int>>arr;
    string ss;
    vector<int>arr2;
    int temp;
    while(1) {
        getline(cin, ss);
        if (ss.size() == 0) {
            break;
        }
        istringstream stemp(ss);
        stemp>>start>>end;
        pair<int, int> t(start, end);
        arr.push_back(t);
        cin.sync();
        cin.clear();
        ss.clear();
    }
    int starti=arr[0].first;
    int endi=arr[0].second;
    int sum=0;
    for(int i=1;i<arr.size();i++){
        if(arr[i].first>endi){
           sum+=endi-starti;
           starti=arr[i].first;
           end=arr[i].second;
        }else {
            end=arr[i].second;
        }
    }
    sum+=endi-starti;
    cout<<sum;
    return 0;
}

2·米小兔的英语考试

题目描述
一串排列好的卡片,每个卡片上都有一个英文字母,组成的字符串为s,现要求可以通过增加卡片、抽出卡片、替换卡片的方式(26个字母均可替换),将卡片排列称目标字符串,求最少需要操作多少次
输入描述
字符串s和字符串t
输出描述
操作次数
样例
输出:
"horses"
"ros"
输出:
3
C++参考代码–仅供参考
//
// Created by HANWENKE on 2022-09-20.
//
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace  std;
int main(){
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    s1.pop_back();
    s2.pop_back();
    s1.erase(s1.begin());
    s2.erase(s2.begin());
    cout<<s1<<endl;
    cout<<s2<<endl;
    unordered_map<char,int>smap1;
    unordered_map<char,int>smap2;
    for(int i=0;i<s2.size();i++)
        smap2[s2[i]]++;
    //首先删除s1中多余的字符
    int count=0;
    for(int i=0;i<s1.size();){
        if(smap2.find(s1[i])==smap2.end()){
            s1.erase(s1.begin()+i);
            count++;
            continue;
        }
        i++;
    }
    if(s1.size()==s2.size()&&s1==s2){
        cout<<count;
    }
    //在s1中找s2的对应值是否存在
    for(int i=0;i<s2.size();i++){
        int k=0;
        if(s1.find(s2[i])==std::string::npos){
            //s1中不存在这个字符--那就在对应位置上构建这个字符
            s1.insert(i,1,s2[i]);
            count++;
        }
    }
    //在s2中找到这个字符对应的位置--进行交换
    int k=0;
    for(int i=0;i<s1.size();i++){
        k=s2.find(s1[i]);
        if(i!=k){
            swap(s1[i],s1[k]);
            count++;
        }
    }
    cout<<count;
    return 0;
}

1.find(s2[i])==std::string::npos){
//s1中不存在这个字符–那就在对应位置上构建这个字符
s1.insert(i,1,s2[i]);
count++;
}
}
//在s2中找到这个字符对应的位置–进行交换
int k=0;
for(int i=0;i<s1.size();i++){
k=s2.find(s1[i]);
if(i!=k){
swap(s1[i],s1[k]);
count++;
}
}
cout<<count;
return 0;
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值