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

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

第一题:表达式合法判断

题目:

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

给定一个表达式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;
    }
};

第五题:血型遗传检测

血型遗传对照表如下:
这里写图片描述
请实现一个程序,输入父母血型,判断孩子可能的血型。
给定两个字符串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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值