小米公司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,数据库和计算机网络基础,考场面比较广,还需要继续努力,祝大家秋招顺利。
查看4道真题和解析