整型数组处置算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]

整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]

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

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

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


分析:

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

//给定任意一个正整数,求比这个数大且最小的“不重复数”“不重复数”的含义是相邻两位不相同,
//例如1101是重复数,1231是不重复数。
int GetMinNum(int nNum)
{
	char Temp[20];
	char OutTemp[20];
	int nLen;
	int i,j, k;
	int nTemp;
	int nCount =0;
	//先判断一下nNum
	itoa(nNum, Temp, 10);
	nLen = strlen(Temp);
	for (i=0; i<nLen-1; i++)
	{
		//处理输入串里是重复数的情况
		if (Temp[i]==Temp[i+1])
		{
			if (i==0)
			{
				//998765
				if (Temp[i]=='9')
				{
					strcpy(OutTemp, "10");
					for (j=1; j<nLen; j++)
					{
						OutTemp[j+1] = (j%2)+'0';
					}

				}
				//889765
				else
				{
					OutTemp[0] = Temp[i];
					OutTemp[1] = Temp[i]+1;
					for (j=2; j<nLen; j++)
					{
						OutTemp[j] = (j%2)+'0';
					}
				}
			}
			else
			{
				for (k=0; k< i; k++)
				{
					OutTemp[k] = Temp[k];
				}
				//10998765
				if (Temp[i]=='9')
				{
					OutTemp[i-1] = Temp[i-1]+1;
					if (i>2)
					{
						if (OutTemp[i-1] == OutTemp[i-2])
						{
							Temp[i-1]+1;
						}
					}

					for (j=i; j<nLen; j++)
					{
						OutTemp[j] = (nCount%2)+'0';
						nCount++;
					}	
				}
				//1088765
				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(i, Temp, 10);
		nLen = strlen(Temp);
		for (j=0; j<nLen-1; j++)
		{
			//有重复,跳出循环。
			if (Temp[j]==Temp[j+1])
			{
				break;
			}
		}

		//没有重复,返回i。
		if (j==nLen-1)
		{
			return i;
		}
	}

	return 0;
}

有兴趣的朋友也可以把上面的函数进行拆分一下,确实有一点长,是吧。

测试代码:

int main()
{
	int nTemp;
	int nRet;
	while(1)
	{
		scanf("%d", &nTemp);
		
		if (nTemp==9999)
		{
			break;
		}
		else
		{
			nRet = GetMinNum(nTemp);

			cout << nRet << endl;
		}
	}
	return 0;
}


测试结果就不贴了,大家多试试吧。


转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12191043