给定任意一个正整数,求比这个数大且最小的“不重复数”
2013-10-12 23:28
351 查看
在整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
有朋友提到如果输入1111111,效率非常低,确实是这样,诸如这样的还有10998765,,99876543,
这个建议提的非常好,现在把算法做了优化,欢迎好心朋友不吝赐教,一起探讨。
转自/article/1385458.html
分析:
对于111111,这样的,输出结果要求是不重复数,那自然前2为应该是12,而后面的就应该是0和1来填充,就不用循环取数来判断是不是不重复数了。基于这个思路实现如下:
实现代码如下(这里,我在原作者的代码里加了些注释,又因为gcc编译器不支持itoa()函数,所以改用sprintf()):
有朋友提到如果输入1111111,效率非常低,确实是这样,诸如这样的还有10998765,,99876543,
这个建议提的非常好,现在把算法做了优化,欢迎好心朋友不吝赐教,一起探讨。
转自/article/1385458.html
分析:
对于111111,这样的,输出结果要求是不重复数,那自然前2为应该是12,而后面的就应该是0和1来填充,就不用循环取数来判断是不是不重复数了。基于这个思路实现如下:
实现代码如下(这里,我在原作者的代码里加了些注释,又因为gcc编译器不支持itoa()函数,所以改用sprintf()):
#include<stdio.h> #include<string.h> #include<stdlib.h> int GetMinAbove(int nNum) { char Temp[20],OutTemp[20]; int nLen = 0; int i = 0,j = 0,k = 0; int nTemp = 0,nCount = 0; //itoa(nNum,Temp,10); sprintf(Temp,"%d",nNum); nLen = strlen(Temp); //先看输入数字是不是循环数 for(i = nNum;i < nLen -1;i++){//输入数字是循环数时 //处理输入串里是重复数的情况 if(Temp[i] == Temp[i+1]){ if(0 == i){ //998765类的数字时 if(Temp[i] == '9'){ strcpy(OutTemp,"10"); for(j = 1;j < nLen;j++){ OutTemp[j+1] = (j % 2) + '0'; } }else{ OutTemp[0] = Temp[i]; OutTemp[1] = Temp[i] + 1; for(j = 2;j < nLen;j++){ OutTemp[j] = (j%2) + '0'; } } }else{//'9'不是在输入数字最高位 for(k = 0;k < i;k++){ OutTemp[k] = Temp[k]; } //1099348 if(Temp[i] == '9'){ OutTemp[i-1] = Temp[i-1] + 1; if(i > 2){ if(Temp[i-1] == Temp[i-2]){ OutTemp[i-1] = Temp[i-1]+1; } } for(j=i;j<nLen;j++){ OutTemp[j] = (nCount % 2)+'0'; nCount ++; } }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(nNum,Temp,10); //itoa(i,Temp,10); //注意,这里是i了 sprintf(Temp,"%d",i); nLen = strlen(Temp); for(j = 0;j<nLen - 1;j++){ if(Temp[j] == Temp[j+1]){//有重复 break; } } if(j == nLen -1){//没有重复 return i; } } return 0; } int main(int argc,char *argv[]) { int nTemp = 0; int nRet = 0; while(1){ scanf("%d",&nTemp); if(9999 == nTemp){ break; }else{ nRet = GetMinAbove(nTemp); printf("%d\n",nRet); } } return 0; }
相关文章推荐
- 给定任意一个正整数,求比这个数大且最小的“不重复数”
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- (百度笔试题)给定任意一个正整数,求比这个数大且最小的“不重复数”。
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
- 程序设计题--给定任意一个正整数,求比这个数大且最小的“不重复数
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 给定任意一个整数,找出比当前这个数大的最小的10个素数之和。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给出任意一个正整数,算出大于它的最小不重复数——最高效[2014百度笔试题]
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 今天开始学Java 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。