嵌入式Linux工程师笔试记录 -- 2020.8.19(十)
嵌入式Linux工程师笔试记录 – 2020.8.19(十)
广州CVTE2019嵌入式软件工程师笔试题
嵌入式Linux工程师笔试记录 -- 2020.8.19
- 1. 虚函数表指针指向对象的起始位置,虚函数表的构建时机时编译期,虚函数表指针在对象实例化时生成。
- 2. NOR flash和NAND flash的比较:
- 3. 统计出一个字符串中每种字母出现的次数,并且打印出各字符对应的次数。要求时间复杂度为O(n)。
- 2020.8.23 修改
- 4.题:6人摇骰子
1. 虚函数表指针指向对象的起始位置,虚函数表的构建时机时编译期,虚函数表指针在对象实例化时生成。
2. NOR flash和NAND flash的比较:
1)首先:flash只能把1变成0,而不能把0变成1,所以每次写入操作都需要擦除一遍;
参考NOR闪存与NAND闪存的读写特点总结归纳
NOR闪存 | NAND闪存 | |
---|---|---|
读写基本单位 | 字 | 块 |
存储介质 | 随机存储介质,使用数据量小的场合 | 连续存储介质,适合数据量较大的场合 |
读写性能 | 读速度比NAND快一些 | 写速度比NOR快很多 |
擦除单元 | 擦除单元多,擦除电路多 | 擦除单元少,电路少 |
可靠性 | 接口简单,数据操作少,位交换少因此可靠性较高 | 接口操作均比较复杂,位交换操作多,可靠性较低 |
3. 统计出一个字符串中每种字母出现的次数,并且打印出各字符对应的次数。要求时间复杂度为O(n)。
输入字符串:“Hello!”
输出打印:
H:1
e:1
l:2
o:1
!:1
这题没有明说要按字符串出现顺序排序,但给的例子确是按照字符出现顺序输出,所以我用了两个数组如下:
// 保存出现的次数
char c_cnt[128] = {0};
// 当一个字符第一次出现,push到该数组中,同时在只有少数字符情况下,减少输出时的遍历次数。
char c_exist[128] = {0};
代码如下:
#include <iostream>
#include <string>using namespace std;
int main(){char c_cnt[128] = {0};char c_exist[128] = {0};string s;cin >> s; // 输入字符串int len = s.length();int i = 0 , j = 0 ;for( ; i < len ; i ++ ){char *p = &c_cnt[s[i]];if( *p == 0 ) //第一次出现c_exist[j++] = s[i];*p += 1 ; // 次数++}for( i = 0 ; i < j ; i ++ ){int cnt = c_cnt[c_exist[i]];cout << c_exist[i] << ":" << cnt << endl;}return 0;
}
2020.8.23 修改
如果对顺序不要求的话, 可以用哈希表(unordered_map)
string s;cin >> s;unordered_map<char , int > c_cnt;// 哈希表插入操作 n * O(1) = O(n)for( int i = 0 ; i < s.length() ; i ++ )++ c_cnt[s[i]];// 遍历 O(n) for( unordered_map<char , int >::iterator it = c_cnt.begin() ; it != c_cnt.end() ; it ++ )cout << it->first << ":" << it->second << endl;
4.题:6人摇骰子
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
int main(){int completors[6] = { 10, 10, 10, 10, 10, 10};srand(time(NULL));int oldwinner = -1 ;int win_fee = 1;int game = 1 ;bool gameover = false;while(!gameover){// 胜利者int winner = rand() % 6;if(winner == oldwinner)win_fee ++;else{ // winner != oldwinner oldwinner = winner;win_fee = 1;}// 算钱for( int i = 0 ; i < 6 ; i ++ ){if( i == winner )continue;completors[i] -= win_fee;}completors[winner] += win_fee*5;// 输出每局每个人的剩余金额cout << "第" << game++ << "场比赛胜利者是:" ;cout << winner+1 << endl;for( int i = 0 ; i < 6 ; i ++ ){cout << i+1 << "金币:" << completors[i] << endl;}cout << endl;cout << endl;// 输出出局者for( int i = 0 ; i < 6 ; i ++ ){if(completors[i] <= 0){cout << i+1 << "出局" << endl;gameover = true;}}}return 0;
}
发布评论