在
整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[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