大于K的最小正整数 的一种解法

全新整理:微软、谷歌、百度等公司经典面试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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值