zoukankan      html  css  js  c++  java
  • 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[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





  • 相关阅读:
    python练习:http协议介绍
    python练习(-)
    字符集与字符编码的强化理解与操作实践
    jquery设置select选中的文本
    盘点互联网巨头奉献的十大开源安全工具[转]
    $.ajax()函数
    sql事务
    json操作工具-LitJson
    接收图片二进制流并保存图片
    用Linq取两个数组的差集
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3348083.html
Copyright © 2011-2022 走看看