微策略的一道笔试题:
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); } }