微策略的一道笔试题:
0和1的字符串,要求找出所有1个数不超过k个的n长度的字符串中第I大的
有没有什么比从小到大遍历,然后数1个数是否符合条件更好的办法?
举几个例子就会发现,其实就是求I的二进制表示:
比如 I=1 : 1
I=2: 10
I=7: 111
所以下面就不讲了。
然后是微策略的另一道流传很广的笔试题:
给一个数字字符串如:123,要你在两个数字间添加‘+’,‘-’或者‘ ’,使得最后的表达式求和为0,如1+2-3
#include<iostream>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
bool checkSum(string& exp)
{
bool isNeg=false;
int sum=0;
int cur=0;
for(int i=0;i<exp.size();i++)
{
if(exp[i]==' ')
continue;
else if (exp[i]=='+')
{
isNeg=false;
}
else if(exp[i]=='-')
{
isNeg=true;
}
else
{
cur=cur*10+exp[i]-'0';
if(i==exp.size()-1||(!isdigit(exp[i+1])&&!isspace(exp[i+1])))
{
sum+=isNeg?-cur:cur;
cur=0;
}
}
}
return sum==0;
}
void solve(string& num,string& cur,int k)
{
if(k>=num.size())
{
if(checkSum(cur))
{
copy(cur.begin(),cur.end(),ostream_iterator<char>(cout," "));
cout<<endl;
}
return;
}
if(k==num.size()-1)
{
cur.push_back(num[k]);
solve(num,cur,k+1);
cur.pop_back();
}
else
{
cur.push_back(num[k]);
char op[3]={'+','-',' '};
for(int i=0;i<3;i++)
{
cur.push_back(op[i]);
solve(num,cur,k+1);
cur.pop_back();
}
cur.pop_back();
}
}
void expression(string num)
{
string cur;
solve(num,cur,0);
}
int main()
{
string s;
while(cin>>s)
{
expression(s);
}
}
本文解析了两道微策略公司的经典笔试题。第一题涉及寻找特定条件下的字符串排列;第二题探讨如何通过在数字间插入运算符使表达式求和为零的方法。
86万+

被折叠的 条评论
为什么被折叠?



