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

全部评论

相关推荐

05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务