欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

去哪儿2016研发工程师编程题 - 题解

程序员文章站 2022-06-30 16:33:50
...

很久的一套题了,说实话这套题真的不咋地,难度偏低,题意描述不清,样例也给的不好。因此,我只给出通过的代码,因为确实没什么可解析的。

第一题:表达式合法判断

题目:

写一段代码,判断一个包括'{','[','(',')',']','}'的表达式是否合法(注意看样例的合法规则。)

给定一个表达式A,请返回一个bool值,代表它是否合法。

测试样例:"[a+b*(5-4)]*{x+b+b*(({1+2)}}"
返回:true

代码:

class ChkExpression {
public:
    bool chkLegal(string A) {
        int st = 0;
        for (int i = 0; i < A.size(); i++) {
            if (A[i] == '{' || A[i] == '(' || A[i] == '[') {
                ++st;
            } else if (A[i] == '}' || A[i] == ')' || A[i] == ']') {
                --st;
            }
        }
        return !st;
    }
};

第二题:乘坐公交

题目:

从小明家所在公交站出发有n路公交到公司,现给出每路公交的停站数(不包括起点和终点),及每次停的时间(一路车在每个站停的时间相同)和发车的间隔,先假定每辆车同时在相对时间0分开始发车,且所有车在相邻两个站之间的耗时相同,都为5分钟。给定小明起床的相对时间(相对0的分钟数),请计算他最早到达公司的相对时间。

给定每路车的停站数stops,停站时间period,发车间隔interval及公交路数n,出发时间s。请返回最早到达时间。保证公交路数小于等于500,停站数小于等于50。

代码:

class TakeBuses {
public:
    int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) {
        // write code here
        int ret = 0x3f3f3f3f;
        for (int i = 0; i < n; i++) {
            int wait = s % interval[i] == 0 ? 0 :( interval[i] - (s % interval[i]));
            ret = min(ret, s + wait + period[i] * stops[i] + (stops[i] + 1) * 5);
        }
        return ret;
    }
};

第三题:字符串替换

题目:

请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。

给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。

测试样例:"A%sC%sE",7,['B','D','F']
返回:"ABCDEF"

代码:

class StringFormat {
public:
    string formatString(string A, int n, vector<char> arg, int m) {
        // write code here
        int len = 0;
        string ret = "";
        for (int i = 0; i < n; i++)
            if (A[i] == '%' && i + 1 < n && A[i + 1] == 's') {
                ret.push_back(arg[len++]);
                ++i;
            } else {
                ret.push_back(A [i]);
            }
        for (; len < m; ret.push_back(arg[len++]));
        return ret;
    }
};

第四题:文本嗅探

题目:

现在有一个字符串列表,和一个关键词列表,请设计一个高效算法,检测出含关键字列表中关键字(一个或多个)的字符串。

给定字符串数组A及它的大小n以及关键词数组key及它的大小m,请返回一个排好序的含关键词的字符串序号的列表。保证所有字符串长度小于等于100,关键词个数小于等于100,字符串个数小于等于200。保证所有字符串全部由小写英文字符组成。若不存在含关键字的字符串,请返回一个只含-1的数组。

测试样例:["nowcoder","hello","now"],3,["coder",now],2
返回:[0,2]

代码:

class KeywordDetect {
public:
    vector<int> containKeyword(vector<string> A, int n, vector<string> keys, int m) {
        // write code here
        vector<int> ret;
        for (auto it = A.begin(); it != A.end(); ++it) {
            for (auto ti = keys.begin(); ti != keys.end(); ++ti) {
                if (it->find(*ti) != string::npos) {
                    ret.push_back(it - A.begin());
                    break;
                }
            }
        }
        if (ret.size() == 0)
            ret.push_back(-1);
        return ret;
    }
};

第五题:血型遗传检测

血型遗传对照表如下:
去哪儿2016研发工程师编程题 - 题解
请实现一个程序,输入父母血型,判断孩子可能的血型。
给定两个字符串fathermother,代表父母的血型,请返回一个字符串数组,代表孩子的可能血型(按照字典序排列)。

测试样例:"A","A"
返回:["A","O"]

代码:

class ChkBloodType {
public:
    vector<string> chkBlood(string father, string mother) {
        // write code here
        vector<string> ret;
        if (father.size() == 2 || mother.size() == 2) {
            ret.push_back("A");
            if (father != "O" && mother != "O")
                ret.push_back("AB");
            ret.push_back("B");
        } else {
            if (father > mother)
                swap(father, mother);
            if (mother == "O") {
                if (father != "O")
                    ret.push_back(father);
                ret.push_back("O");
            } else {
                if (father == mother) {
                    ret.push_back(father);
                    ret.push_back("O");
                } else {
                    ret.push_back("A");
                    ret.push_back("AB");
                    ret.push_back("B");
                    ret.push_back("O");
                }
            }
        }
        return ret;
    }
};
相关标签: 去哪儿