您的位置:首页 > 其它

百度2014校招-深圳-开发测试-求最小“不重复数”

2013-10-12 22:06 543 查看
给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如:1101是重复数,1231是不重复数

思路:

1、前把这个正整数加1,保证求得的数比这个数大

2、从左到右开始遍历加1后的正整数,如果前一个数字与后一个数字相同,则后一个数字需要加1

3、如果后一个数字为9的话,加1会进位,这时可能会引起前面已检测过的值产生重复,此时,需要重新遍历

4、加1后,为保证值最小,则后面数值以10101010...填充

代码:

//方法一,直接+1判断是否符合
//但如11011011011时,效率太低
int GetMin(int a){
int k,l;
while(1){
k=++a;
l=k%10;
k/=10;
while(k){
if(l==k%10){
break;
}else{
l=k%10;
k/=10;
}
}
if(k==0)return a;
}
}

//方法二,也就是本文所写的思路
//直接观察数的各个数字规律求解
int GetMin2(int a){
int tri=1;
int front,back;
for(int i=a;i>10;i/=10)tri*=10;

while(tri>1){
front=a/tri%10;
back=a/(tri/10)%10;
if(front==back){
a+=tri/10;//后一个数字加1
tri/=10;
a/=tri;//后面的数字先以0填充
a*=tri;
if(front!=a/(tri*10)%10)return GetMin2(a);//产生进位,需要重新检验前面的值
}
tri/=10;
}
return a;
}

void main(){
cout<<GetMin2(989899)<<endl;
cout<<GetMin(989898);
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: