小米公司2020年9月15日嵌入式软件开发笔试编程题
[第一题]输入案例中可能含有六种符号,分别是'('、')'、'['、']'、'{'、'}'。编写一个程序判断输入的符号是否是一一配对的,是输出true,否返回false。例如(({{[[}}))]],输出true;)){{]]}(,返回false。
[分析]我拿到这道题的第一想法就是暴力匹配。
(1)首先从头开始找,找到'(',就在后面找一个')'与之配对,找到了将这个')'设置成字符'0',其他符号同理。
(2)如果按照前面这种思路,输入为)){{}}这种情况,也会输出true,因此还需要在第一步执行结束之后(输出字符串变成了")){{00"),判断字符串中还是否存在反括号(包括圆括号、方括号和花括号)。
下面给出自己写的代码,考试的时候第二种情况没有考虑到,所有没有ac,考完之后又研究了一下才搞明白。所以这个代码我能想到的输入都能正确输出,不知道正式考试能不能ac,仅供参考。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; class Solution_1{ public: void Input(void){ cin >> User_Input; } void Output(void){ if(flag == 1) cout << "false" << endl; else cout << "true" << endl; } void Solve(void){ for(size_t i=0; i<User_Input.size(); ++i){ if(User_Input[i] == '('){ for(size_t j_1=i+1; j_1<User_Input.size(); ++j_1){ if(User_Input[j_1] == ')'){ User_Input[j_1] = '0'; break; } else if(j_1 == User_Input.size()-1){ flag = 1;//找到结束还没找到,返回false; return;//结束程序 } } } if(User_Input[i] == '{'){ for(size_t j_1=i+1; j_1<User_Input.size(); ++j_1){ if(User_Input[j_1] == '}'){ User_Input[j_1] = '0'; break; } else if(j_1 == User_Input.size()-1){ flag = 1;//找到结束还没找到,返回false; return;//结束程序 } } } if(User_Input[i] == '['){ for(size_t j_1=i+1; j_1<User_Input.size(); ++j_1){ if(User_Input[j_1] == ']'){ User_Input[j_1] = '0'; break; } else if(j_1 == User_Input.size()-1){ flag = 1;//找到结束还没找到,返回false; return;//结束程序 } } } } for(size_t i=0; i<User_Input.size(); ++i){ if(User_Input[i] == ')'){ flag = 1; return; } if(User_Input[i] == ']'){ flag = 1; return; } if(User_Input[i] == '}'){ flag = 1; return; } } flag = 0; return; } private: string User_Input; int flag = 0; }; int main() { Solution_1 sol; sol.Input(); sol.Solve(); sol.Output(); return 0; }
[第二题]字符串去重,例如输入I love xiaomi,则输出I lovexiam
[分析]需要注意的是如果用C++来写这道题,切记不要用cin >> 来做输入,因为这种方式不能处理空格,遇到空格就终止输入了,因此可以用getling()来做输入。这一步考虑到之后就可以进行处理了。
(1)定义一个输出字符串变量,遍历输入字符串,对每一个输入字符都在输出字符中查找,如果不存在就“拼接”上去,否则不做处理。
下面给出参考代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; class Solution_2{ public: void Input(void){ getline(cin, User_Input);//用cin>>遇到空格就GG了 } void Output(void){ cout << User_Output << endl; } void Solve(void){ //遍历输入的字符串 for(size_t i=0; User_Input.cbegin()+i<User_Input.cend(); ++i){ //在输出字符串中查找是否包含该该字符,没有则直接拼接在后面 if(find(User_Output.cbegin(), User_Output.cend(), User_Input[i]) == User_Output.cend()){ User_Output += User_Input[i]; } } return; } private: string User_Input; string User_Output; vector<char> str; }; int main() { Solution_2 sol2; sol2.Input(); sol2.Solve(); sol2.Output(); return 0; }
[总结]本人自动化水硕一枚,小米的嵌入式笔试编程题回过头来看并不难,然而实际考试的时候处理的并不满意。我认为还是和平时练习的时候总结少了有关,很多细节需要在平时的练习或者项目中去体会,特别是编程,有时候一个小细节卡半天还不知道原因在哪,加上考试时间的紧迫自然而然会有一些紧张的情绪。同时在选择题部分还考察了数据结构,java,数据库和计算机网络基础,考场面比较广,还需要继续努力,祝大家秋招顺利。