[各种面试题] 第K大的拥有个数不超过1的字符串

微策略的一道笔试题:

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);
	}
}


你可能感兴趣的:([各种面试题] 第K大的拥有个数不超过1的字符串)