去哪儿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;
}
};
第五题:血型遗传检测
血型遗传对照表如下:
请实现一个程序,输入父母血型,判断孩子可能的血型。
给定两个字符串father
和mother
,代表父母的血型,请返回一个字符串数组,代表孩子的可能血型(按照字典序排列)。
测试样例:"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;
}
};