23、Google2009 华南地区笔试题
给定一个集合 A=[0,1,3,8](该集合中的元素都是在 0,9 之间的数字,但未必全部包含),
指定任意一个正整数 K,请用 A 中的元素组成一个大于 K 的最小正整数。
比如,A=[1,0] K=21 那么输出结构应该为 100。
/*
23、Google2009 华南地区笔试题
给定一个集合 A=[0,1,3,8](该集合中的元素都是在 0,9 之间的数字,但未必全部包含),
指定任意一个正整数 K,请用 A 中的元素组成一个大于 K 的最小正整数。
比如,A=[1,0] K=21 那么输出结构应该为 100。
思路:
1.将数组A排序.
2.生成一个十个数的数组B,B[i]中的每一个的元素都是A中比i大的最小的元素,
如果不在A中则用A中所组合而成的最小的两位数代替,
比如上例则生成B[]={1, 3, 3, 8, 8, 8, 8, 8, 10, 10}
3.从给定的数最高位开始找到第一不在A中的位数i的权值m,
从第i位开始到最高位找到第一个权值m, B[m]!=max(A中组合而成的最小的两位数),
剩下的位都用A[0]代替。
*/
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
int max=0;
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
//判断当前位是否在A中
int is_in(int *A,int number, int len)
{
int i=0;
int j=len-1;
int mid=0;
while (i<=j)
{
mid=(i+j)/2;
if (A[mid]<number)
i=mid+1;
else if (A[mid]>number)
j=mid-1;
else
return 1;
}
return 0;
}
int get_number(int *A, int* B, int number, int len)
{
int bit=0;
int i=0;
int temp=number;
int j,sum;
j=sum=0;
while(temp)
{
bit++;//位数
temp/=10;
}
int *p=(int *)malloc(sizeof(int)*bit);
if (!p) {
printf("out of space\n");
exit(-1);
}
temp=number;
i=0;
while(temp)
{
p[i]=temp%10;
temp=temp/10;
i++;
}
for(i=bit-1;i>0;i--)
if(!is_in(A,p[i],len)) //最左边开始 从高位到低寻找到一位不在A中 后面用A[0]补
break; //在A中的不用变
for (j=i;j<bit;j++)
{
if (max!=B[p[j]]) //P[J]表示在A中的那一位 用B[P[J]]表示 大于这位数
{
p[j]=B[p[j]];
break;
}
}
if(j==bit)
p[--j]=max;
while(--j>= 0)
p[j]=A[0];
for (i=bit-1,sum=0;i>=0;i--)
sum=sum*10+p[i];
free(p);
return sum;
}
int main()
{
int A[]={3,1,0,8};
int i, j;
int *B =NULL;
int number=123;
int temp=0;
int result=0;
int len=sizeof(A)/sizeof(int);
qsort(A,len,sizeof(A[0]),cmp);
if (A[0]!=0)
max=A[0]*11;//自己表示 eg:1->11 2->22 3->33
else
max=A[1]*10;//0 1->10 ;0 2->20
B=(int *)malloc(sizeof(int)*10);
if (!B) {
printf("out of space\n");
exit(0);
}
j=i=0;
while(i<len&&j<10)
{
if (A[i]>j)
{
B[j]=A[i];
j++;
}
else
i++;
}
while (j<10)
{
B[j]=max;
j++;
}
result=get_number(A,B,number,len);
printf("the answer is %d\n", result);
return 0;
}