求给定数的最大“不重复数”

原创 2013年12月04日 21:06:42

题目:给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。

算法:

1、把整数放到字符数组里面去,从高位为低位(用变量i)扫描,找到重复的数位,重复数位为“99”跳到第2步,否则跳到第3步,若

没有重复的数位,则该数为不重复数,返回;

2、遇到“99”的重复数,则把“99”改为“00”,然后在“99”前面一位字符加1,把扫描的地方定位在“99”往高位方向的第2位,比如是

1299,变换后为1300,然后把扫描变量 i 定位在1这一数位上,返回第1步;

3、遇到非“99”的重复数,则直接在低位加1,后面依次变为010101……,结果就是最小的不重复数,返回改值;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int getNumNonrepetition(const long long  NumGived, char NumStr[])
{
    int NumTmp = NumGived;
    int NumLength = 0;
    int i = SIZE - 1;
    //把整数放到字符数组里面去,从后往前放,比如1234,
    //那么数组NumStr[96] = 1  NumStr[97] = 2  NumStr[98] = 3  NumStr[99] = 4, SIZE = 100
    do
    {
        NumStr[i] = NumTmp % 10 + '0';
        NumTmp /= 10;
        i--;
    }
    while(NumTmp != 0);
    NumLength = SIZE - i - 1;//计算整数的位数

    int flag = 0;//设置010101的时候用的变量
    i = SIZE - NumLength;
    while( 1 )
    {
        //定位到重复的位上面,下标i + 1为低位,此时NumStr[i] == NumStr[i + 1]
        while(i + 1 < SIZE && NumStr[i] != NumStr[i + 1]) i++;
        if(i == SIZE - 1) break;//扫完一遍,没有重复的,跳出循环,该数是不重复数

        if(NumStr[i + 1] == '9')//重复的数位为99这种情况,将这两位全部置0,高位加1
        {
            NumStr[i + 1] = '0';
            i--;
            NumStr[i + 1] = '0';
            i--;
            NumStr[i + 1] += 1;
        }
        else//重复的
        {
            //低位加1
            NumStr[i + 1] += 1;
            i += 2;
            flag = 0;
            //后续全部设为0101……,这个时候肯定是不重复数了,所以可以跳出循环
            while( i < SIZE )
            {
                NumStr[i] = flag % 2+ '0';
                flag++;
                i++;
            }
            break;
        }
    }
    //打印最小的”不重复数“
    int start = SIZE - NumLength;
    //如果是99开头的数字,高位可能会进位,判断是否为零,不为零则有进位,需打印出来
    if(NumStr[start - 1] != '0') putchar(NumStr[start - 1]);
    for(i = start; i < SIZE; i++ )
    {
        putchar(NumStr[i]);
    }
    return 0;
}
int main(void)
{
    long long  NumGived = 119998988;
    char NumStr[SIZE];
    memset(NumStr, '0', SIZE * sizeof(char));
    getNumNonrepetition(NumGived, NumStr);
    return 0;
}


百度面试题 运用递归求最大重复数

运用递归求最大重复数
  • susidian
  • susidian
  • 2015年08月25日 16:17
  • 378

不含有重复数字的组合的求法——递归法和二进制法

//组合#include #include int n,r;int count = 0;void printR(int a[]){ count++; for(int j = r-1;j>=0;j--)...
  • Deutschester
  • Deutschester
  • 2010年06月05日 14:00
  • 2353

百度2014招聘笔试解答1

1、给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。(15分) //解题思路,从最高位开始遍历此整数,将最先遇到...
  • vivo133
  • vivo133
  • 2013年10月10日 16:17
  • 758

求最大不重复子串(Java)

一个经典问题,就是求字符串中不包含重复字符的最大子串。如果有多个这样的子串,则输出第一个。 我的思路其实也就是从头比较到尾来找,只是中间加了一些判断条件进行了优化。具体流程(先转化成char[] c...
  • lsjweiyi
  • lsjweiyi
  • 2017年04月20日 13:26
  • 974

算法:求比指定数大且最小的“不重复数”问题的高效实现

问题:给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数           ——引自 百度2014校招笔试题目题解...
  • jiary5201314
  • jiary5201314
  • 2016年04月21日 16:42
  • 398

求最小不重复数

/** *  * Un概要说明 *  *返回输入数的最小不重复数 *  */public class Un {  /**  *   * isNum方法概述  * 判断是否是重复数  *  * @par...
  • jun526
  • jun526
  • 2010年10月15日 09:24
  • 321

求一个字符串的最长不重复子串的最大长度

一道面试题,当时想到有一种最优的解法,可怎么也想不出来了,现在回顾了一下: 函数原型如下: int getLongestSubString(string s){ } 就是求出一个给定字...
  • lwb102063
  • lwb102063
  • 2016年10月11日 20:22
  • 1251

【有趣的面试算法题】之四 求最小不重复数,源于百度2014届校园招聘软件研发岗位深圳站

百度2014届校园招聘软件研发岗位深圳站的笔试中有这样一题:输入一个任意正整数,输出一个比输入值要大但又不重复的最小数(不重复是指:相邻两个数字不相同,例如1101是重复,1234不重复,1201不重...
  • zfdxx369
  • zfdxx369
  • 2013年09月29日 16:26
  • 2254

[经典面试题][百度]求比指定数大且最小的“不重复数”

【题目】 给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。 【来源】 2014年百度校招笔试题 【思路...
  • SunnyYoona
  • SunnyYoona
  • 2015年02月05日 16:55
  • 1194

华为编程大赛-查找最大的不重复数

/* 问题描述:查找最大的不重复数 如果一个数字十进制表达时,不存在连续两位相同,则称之为"不重复数"。 例如, 105 、 1234 和 12121 都是"不重复数",而 11 、 100 和 12...
  • gylltq
  • gylltq
  • 2014年04月21日 19:53
  • 363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求给定数的最大“不重复数”
举报原因:
原因补充:

(最多只允许输入30个字)