百度筆試題:找最小的不重複數

小飛_Xiaofei發表於2013-12-04

版權所有。所有權利保留。

歡迎轉載,轉載時請註明出處:

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

相關文章