您的位置:首页 > 其它

给定任意一个正整数,求比这个数大且最小的“不重复数”

2013-10-12 23:28 351 查看
整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]

有朋友提到如果输入1111111,效率非常低,确实是这样,诸如这样的还有10998765,,99876543,

这个建议提的非常好,现在把算法做了优化,欢迎好心朋友不吝赐教,一起探讨。

转自/article/1385458.html

分析:

对于111111,这样的,输出结果要求是不重复数,那自然前2为应该是12,而后面的就应该是0和1来填充,就不用循环取数来判断是不是不重复数了。基于这个思路实现如下:

实现代码如下(这里,我在原作者的代码里加了些注释,又因为gcc编译器不支持itoa()函数,所以改用sprintf()):

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int GetMinAbove(int nNum)
{
	char Temp[20],OutTemp[20];
	int nLen = 0;
	int i = 0,j = 0,k = 0;
	int nTemp = 0,nCount = 0;
	//itoa(nNum,Temp,10);
	sprintf(Temp,"%d",nNum);
	nLen = strlen(Temp);
	//先看输入数字是不是循环数
	for(i = nNum;i < nLen -1;i++){//输入数字是循环数时
		//处理输入串里是重复数的情况
		if(Temp[i] == Temp[i+1]){
			if(0 == i){
				//998765类的数字时
				if(Temp[i] == '9'){
					strcpy(OutTemp,"10");
					for(j = 1;j < nLen;j++){
						OutTemp[j+1] = (j % 2) + '0';
					}
				}else{
					OutTemp[0] = Temp[i];
					OutTemp[1] = Temp[i] + 1;
					for(j = 2;j < nLen;j++){
						OutTemp[j] = (j%2) + '0';
					}
				}
			}else{//'9'不是在输入数字最高位
				for(k = 0;k < i;k++){
					OutTemp[k] = Temp[k];
				}
				//1099348
				if(Temp[i] == '9'){
					OutTemp[i-1] = Temp[i-1] + 1;
					if(i > 2){
						if(Temp[i-1] == Temp[i-2]){
							OutTemp[i-1] = Temp[i-1]+1; 
						}
					}
					for(j=i;j<nLen;j++){
						OutTemp[j] = (nCount % 2)+'0';
						nCount ++;
					}
				}else{
					OutTemp[i] = Temp[i];
					OutTemp[i+1] = Temp[i+1] + 1;
					for(j = i+2;j < nLen;j++){
						OutTemp[j] = (nCount % 2) + '0';
						nCount ++;
					}
				}
			}

			return atoi(OutTemp);
		}
	}
	for( i = nNum +1;;i++){
		//itoa(nNum,Temp,10);
		//itoa(i,Temp,10); //注意,这里是i了
		sprintf(Temp,"%d",i);
		nLen = strlen(Temp);
		for(j = 0;j<nLen - 1;j++){
			if(Temp[j] == Temp[j+1]){//有重复
				break;
			}
		}
		if(j == nLen -1){//没有重复
			return i;
		}
	}
	return 0;
}

int main(int argc,char *argv[])
{
	int nTemp = 0;
	int nRet = 0;
	while(1){
		scanf("%d",&nTemp);
		if(9999 == nTemp){
			break;
		}else{
			nRet = GetMinAbove(nTemp);
			printf("%d\n",nRet);
		}
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐