百度笔试题:找最小的不重复数

版权所有。所有权利保留。

欢迎转载,转载时请注明出处:

http://blog.csdn.net/xiaofei_it/article/details/17123835

给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。

思路很简单:

1、把原数加1。

2、从高位开始找重复位。

3、将这位加1。

4、如果是10,此位变0,指针指向高位,转3。如果不是10,转5。

5、这位是否与高位相同,相同的话,转3。不同则转6。

6、把这位以后刷成01串。

其实本质就是贪心,把最高的重复位变掉,之后刷成01串,但变后可能又重复了,那么再变。

自己试试即可。

代码如下:

 

#include <iostream>
#include <cstring>
using namespace std;
#define MAX 100
int n[MAX],len;
void convert(string str)
{
	memset(n,0,sizeof(n));
	for (int i=0;i<str.length();i++)
		n[str.length()-1-i]=str[i]-'0';
	len=str.length();
}
void find()
{
	int i;
	n[0]++;
	for (i=0;n[i]==10;i++)
	{
		n[i]=0;
		n[i+1]++;
	}
	if (i==len) len++;
	bool yes=true;
	for (i=len-1;i>=1;i--)
		if (n[i]==n[i-1])
		{
			yes=false;break;
		}
	if (yes) return;
	n[--i]++;
	while (true)
	{
		while (n[i]==10)
		{
			n[i]=0;
			n[++i]++;
		}
		if (i==len)
			len++;
		if (n[i]==n[i+1])
			n[i]++;
		else
			break;
	}
	if (i==0) return;
	n[--i]=0;
	for (i--;i>=0;i--)
		n[i]=1-n[i+1];
}
int main()
{
	string str;
	while (cin>>str)
	{
		convert(str);
		find();
		for (int i=len-1;i>=0;i--) cout<<n[i];
		cout<<endl;
	}
	return 0;
}


输入样例:

 

121
19898989
989898989
989898
1989898
2199
120
0
2
21
20

输出样例:

123
20101010
1010101010
1010101
2010101
2301
121
1
3
23
21

 

posted on 2013-12-05 10:42  我的小人生  阅读(207)  评论(0编辑  收藏  举报