dji-2022-08-14-C++开发B卷 70左右
一、5*4' 单选
结构体中最后的数据成员是一个指针,指针地址和结构体的地址是不是连续的?不一定
指针访问是不是一种间接的访问?是对错
char a[3]={'e',0,'t'};
char b[]={'a','b',128};
long c[]={1,0,1.0f};
char a[3]="123";new 申请的内存不能用free() 释放
都能运行,不会报错。。选对的 C?
a。右值引用任何时候都是右值
b。右值引用任何时候都是左值
c。匿名右值引用是右值
d。具名右值引用是右值
二、5*4' 多选
虚函数不可以为静态函数
虚函数表指针的地址在对象内存布局的最前面(单继承)多选题选对的。。
选择排序不稳定
快排空间复杂度是O(1)
20,3,40,6,25,16,29,以第一个为pivot,快排一轮后是3,6,16,20,40,25,29C是C++的子集
引用本质是指针
char* 和 char[] 本质是同一种类型正确的是 (ad)
a。dynamic_cast 可以把派生类指针指向其可访问基类的指针
b。const_cast 可以把 const int* 转换为 char*
c。reinterpret_cast 可以把 const char* 转换为 char*
d。static 不能去掉 const 修饰智能指针用模板类实现,对
会把数据存放在自己类内存存储空间中,❌
三、3*6' 填空
- 32位系统,4B对齐,
sizeof(a)=12B
struct a{char b; char* c; short d;};64位 8B 对齐是24字节
- 已知 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();
sizeof(a)=又改错了自己试吧64位系统
class a{
public:
a(){char* ch=new char[10];}
~a(){delete[] ch;}
private:
char* ch;
};四、8*3' 简答
解释什么是栈内存、什么是堆内存,以及二者区别
下面代码自测通过,请问有无问题,解释自测通过的原因,对于减少这种代码合入仓库有没有什么建议 (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;
};- 多线程加锁的基本原则。
- 避免出现死锁
- 尽量用条件变量或信号量机制,避免忙等待,自旋
- 加锁是有一定开销的,避免对很频繁又执行时间很短的任务多次加锁
- 只对临界区加锁
- 记得及时地释放锁
- 并行访问共享资源时,一定要加锁保护
- 指责单一
- 锁范围尽量小,只锁对应资源操作代码
- 避免嵌套加锁;如果必须加锁,务必保证不同地方的加锁顺序是一样的
- 可重入函数尽量只使用局部变量和函数参数,少用全局变量、静态变量
- 锁中避免调用函数;如果必须调用函数,务必保证不会造成死锁
- 锁中避免使用跳转语句
五、编程 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++#
