dji-2022-08-14-C++开发B卷 70左右

一、5*4' 单选

  1. 结构体中最后的数据成员是一个指针,指针地址和结构体的地址是不是连续的?不一定
    指针访问是不是一种间接的访问?是

  2. 对错
    char a[3]={'e',0,'t'};
    char b[]={'a','b',128};
    long c[]={1,0,1.0f};
    char a[3]="123";

  3. new 申请的内存不能用free() 释放
    图片说明
    都能运行,不会报错。。

  4. 选对的 C?
    a。右值引用任何时候都是右值
    b。右值引用任何时候都是左值
    c。匿名右值引用是右值
    d。具名右值引用是右值

二、5*4' 多选

  1. 虚函数不可以为静态函数
    虚函数表指针的地址在对象内存布局的最前面(单继承)

  2. 多选题选对的。。
    选择排序不稳定
    快排空间复杂度是O(1)
    20,3,40,6,25,16,29,以第一个为pivot,快排一轮后是3,6,16,20,40,25,29

  3. C是C++的子集
    引用本质是指针
    char* 和 char[] 本质是同一种类型

  4. 正确的是 (ad)
    a。dynamic_cast 可以把派生类指针指向其可访问基类的指针
    b。const_cast 可以把 const int* 转换为 char*
    c。reinterpret_cast 可以把 const char* 转换为 char*
    d。static 不能去掉 const 修饰

  5. 智能指针用模板类实现,对
    会把数据存放在自己类内存存储空间中,❌

三、3*6' 填空

  1. 32位系统,4B对齐,sizeof(a)=12B
struct a{char b; char* c; short d;};

64位 8B 对齐是24字节

  1. 已知 capacity 翻倍增长,a=6
    先写的6,后改错成了16,以为初始化成16,然后按 16n-1 变化
vector<int> v(3);
v.push_back(1);
v.reserve(5);
v.pop_back();
int a=v.capacity();
  1. sizeof(a)=又改错了自己试吧 64位系统
class a{
public:
    a(){char* ch=new char[10];}
    ~a(){delete[] ch;}
private:
    char* ch;
};

四、8*3' 简答

  1. 解释什么是栈内存、什么是堆内存,以及二者区别

  2. 下面代码自测通过,请问有无问题,解释自测通过的原因,对于减少这种代码合入仓库有没有什么建议 (8')

#include<functional>
#include<thread>

class c{
public:
    c(function<void()>f):fc(move(f)),t([this](){fc();}){}
    ~c(){
    // 两个if
    // 两个函数:joinable()、join()
    }
private:
    thread t;
    function<void()> fc;
};
  1. 多线程加锁的基本原则。
  1. 避免出现死锁
  2. 尽量用条件变量或信号量机制,避免忙等待,自旋
  3. 加锁是有一定开销的,避免对很频繁又执行时间很短的任务多次加锁
  4. 只对临界区加锁
  5. 记得及时地释放锁
  1. 并行访问共享资源时,一定要加锁保护
  2. 指责单一
  3. 锁范围尽量小,只锁对应资源操作代码
  4. 避免嵌套加锁;如果必须加锁,务必保证不同地方的加锁顺序是一样的
  5. 可重入函数尽量只使用局部变量和函数参数,少用全局变量、静态变量
  6. 锁中避免调用函数;如果必须调用函数,务必保证不会造成死锁
  7. 锁中避免使用跳转语句

五、编程 18'

base64编码

输入一个hex编码(16进制字符串)表示的含大小写字符的字节序列,字符串长度为偶数且不超过100,输出其 base64 编码。

每6个bit为一个64进制字符,3个字节由4个可打印字符表示。

0~25对应A~Z,26~51对应a~z,52~61对应0~9,62对应+,63对应/

当输入的二进制序列字节数不为3的倍数时,需要用0字节将长度补充到3的倍数,为与实际的“0”字节进行区别,补充的“0”会被编码为“=”。

我加:补充的0是在字符串末尾,如果输入字符串还剩下小于6位没打印,和补充的0组合在一起翻译,而不是作为等于号。

输入:00
输出:AA==
解释:补充两个0字节,得到24个二进制0。

#include<iostream>
#include<vector>
using namespace std;

inline char i64c(int i){
    if(i<26) return 'A'+i;
    if(i<52) return 'a'+(i-26);
    if(i<62) return '0'+(i-52);
    if(i==62) return '+';
    return '/';
}

inline int r(char i){
    if(isdigit(i)) return i-'0';
    i=tolower(i);
    return 10+(i-'a');
}

// 86%。歪打正着
int main(){
    string s,ans;
    cin>>s;
    // if(s.length()==0){
    //   cout<<"====";
    //   return 0;
    // }
    vector<int> a;
    for(auto c:s){
        int g = r(c);
        if(g&8)a.push_back(1);
        else a.push_back(0);
        if(g&4)a.push_back(1);
        else a.push_back(0);
        if(g&2)a.push_back(1);
        else a.push_back(0);
        if(g&1)a.push_back(1);
        else a.push_back(0);
    }
    int i=0;
    while(a.size()%6!=0){
        a.push_back(0);
    }
    while(i+6<=a.size()){
        int k=i, to=k+6,sum=0;
        while(k<to){
          sum=sum*2+a[k];
          k++;
        }
        ans+=string(1,i64c(sum));
        i+=6;
    }
    while(a.size()%24!=0){
        for(int q=0;q<6;q++)
          a.push_back(0);
        ans+="=";
    }
    // while(i<a.size()){
    //     ans+="=";
    //     i+=6;
    // }
    cout<<ans;
    return 0;
}


// 43%  更符合题意
// int main(){
//     string s,ans;
//     cin>>s;
//     vector<int> a;
//     for(auto c:s){
//         int g = r(c);
//         if(g&8)a.push_back(1);
//         else a.push_back(0);
//         if(g&4)a.push_back(1);
//         else a.push_back(0);
//         if(g&2)a.push_back(1);
//         else a.push_back(0);
//         if(g&1)a.push_back(1);
//         else a.push_back(0);
//     }
//     int i=0, b=0;
//     while(a.size()%6!=0){
//         a.push_back(0);
//         b++;
//     }
//     while(i+6<=a.size()){
//         int k=i, to=k+6,sum=0;
//         while(k<to){
//           sum=sum*2+a[k];
//           k++;
//         }
//         ans+=string(1,i64c(sum));
//         i+=6;
//     }
//     while(b<8){
//         a.push_back(0);
//         b++;
//     }
//     while(a.size()%24!=0){
//         for(int q=0;q<8;q++)
//           a.push_back(0);
//     }
//     while(i<a.size()){
//         ans+="=";
//         i+=6;
//     }
//     cout<<ans;
//     return 0;
// }
#大疆校招##大疆笔试##2023校招##笔试##C++#
全部评论
总共给了多长时间
点赞
送花
回复
分享
发布于 2022-08-15 20:16

相关推荐

4 14 评论
分享
牛客网
牛客企业服务