当天在北邮,参加了笔试。
部分题目如下:
编程题目:给定一段字符串,如“ab*cd”,可将 * 替换成 0 或者 1 ,输出所有可能情况?
正确思路:首先统计字符串里是否存在*, 有多少个?
void gen_dfs(string &s1, vector<string> &res, int start, int bgn, int num)
{
for(int i = start; i < s1.size(); i++)
{
if(s1[i] == '*')
{
s1[i] = '0';
gen_dfs(s1, res, i+1, bgn+1, num);
s1[i] = '1';
gen_dfs(s1, res, i+1, bgn+1, num);
s1[i] = '*'; /* 注意,必须替换回 * ,否则得不到正确结果! */
}
}
if(bgn == num && i == s1.size()) /* 注意,必须在这边判断 是否已经替换完毕? */
res.push_back(s1);
}
vector<string> gen_result(string &s1)
{
vector<string> res;
if(s1.empty())
return res;
int num = 0;
for(int i = 0; i < s1.size(); i++)
{
if(s1[i] == '*')
num++;
}
if(num == 0)
return res;
gen_dfs(s1, res, 0, 0, num);
return res;
}
上述算法采用递归思想,如果采用“迭代”,该怎么做?
答案:“增量构造法”,参考leetcode的subsets题目。具体代码如下:
/* a string contains *, replace * with 1/0, iteratively */
vector<string> replaceString(string str)
{
vector<string> res;
vector<int> temp;
if(str.empty())
return res;
int num = 0;
for(int i = 0; i < res.size(); i++)
num++;
if(num == 0)
return res;
for(int i = 0; i < str.size(); i++)
{
if(str[i] == '*')
{
str[i] = '0';
temp.push_back(i);
}
}
res.push_back(str); /* 第一步,首先把“*”全部替换成0,然后将此字符串压入res */
while(!temp.empty()) /* 增量构造法 */
{
res.reserve(res.size() * 2); /* 首先扩容res的容量 */
copy(res.begin(), res.end(), back_inserter(res)); /* 将res的前半部分元素,拷贝到后半部分 */
auto ite = res.begin() + res.size()/2 - 1;
for(; ite != res.end(); ite++)
(*ite)[temp[temp.size()-1]] = '1'; /* 替换res后半部分元素的一个字符,这里从后往前 */
temp.erase(temp.end()-1, temp.end()); /* temp里存放的是“*”在原字符串的位置 */
}
return res;
}