全新整理:微软、谷歌、百度等公司经典面试100题
23、Google2009华南地区笔试题
给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),
指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
比如,A=[1,0] K=21 那么输出结构应该为100。
int findmorethan(int *p, int n, int k)
{
int i = 0;
while(i<n)
if(p[i++]>k)
return p[--i];
return -1;
}
int geneMinmore(int *p, int n, int k)
{
//p为升序数组
int j = k;
int nRet = 0;
vector<int> vec;
while(j!=0)
{
vec.insert(vec.begin(),j%10);
j /= 10;
}
int i;
for(i=(int)vec.size()-1;i>=0;i--)
{
int m = findmorethan(p, n, vec[i]);
if(m!=-1)
{
vec[i] = m;
break;
}
}
for(int t=0;t<=i;t++)
{
nRet *= 10;
nRet += vec[t];
}
j = findmorethan(p, n, -1);
if(i==-1)
nRet = findmorethan(p, n, 0);
while(++i<vec.size())
{
nRet *= 10;
nRet += j;
}
return nRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
//printf("/n");
int p[] = {0,1,3,8};
int n = geneMinmore(p, sizeof(p)/sizeof(int), 21);
return 0;
}