[算法]百度2014笔试算法题-最小不重复数

给出任意一个正整数,算出大于它的最小不重复数(即不存在相邻两个数相同的情况)

如4321的最小不重复数为4325,9876的最小不重复数为10234

算法:

将正整数转换为字符串形式,

如n=12345,转换为字符串nStr[]="54321"

用一个数组a[0-9]标记数字0-9出现的次数

用flag表示出现重复数字的次数,如当前字符串为 1 2 3 4 5,flag = 0;1 2 3 4 3 flag = 1;如1 2 2 2 3 3 3 flag = 4

然后从nStr从前往后开始遍历(等同于从数字权重低的位往高位遍历)

记的当前遍历的字符对应的数字为m,然后令a[m]--,就是m出现的次数减一,如果a[m]自减之后a[m]的值大于等于1,则令flag--,因为m的重复次数减少了一次

if(flag==0)//表示没有重复当前字符后面没有数字重复。

{

  从a[m+1]至a[9]中找寻第一个为0的下标i,

  如果i<=9,则令当前字符为i,将前面已遍历的字符串重置为a[0-9]中元素为零的下标能够表示的最小的不重复整数。

  否则i>9,如果i不是最后一个下标,则表示a[m+1]至a[9]都是等于1,则m+1 至9都已经在后面的字符串中使用了。只能通过遍历下一个字符来寻找下一次的i。如果i是最后一个下标,则令i+1是1,然后将后面的重置为a[0-9]中元素为零的下标能够表示的最小的不重复整数

}

else

{

  遍历下一字符。

}

 

 

#include <iostream>
using std::cout;
void fillRest(int nFlag[10], char str[],int n)
{
    int i = 0, j = n-1;
    while(j >= 0)
    {
        while(nFlag[i]>0)
        {
            ++i;
        }
        str[j] = i + '0';
        ++i;
        --j;
        
    } 
}
int str2int(char str[10])
{
    int sum = 0 ,i = 0,t = 1;
    while(str[i] != '\0')
    {
        sum += (str[i]-'0')*t;
        t *= 10;
        ++i;
    }
    return sum;
}
int upperUnique(int n)
{
    int nFlag[10]={0}, temp = n, i = 0, flag = 0;
    char nStr[10];
    while(temp>0)
    {
        nStr[i] ='0' + temp % 10;
        if(nFlag[temp % 10] != 0)
        {
            ++flag;
        } 
        ++nFlag[temp % 10];
        temp = temp / 10;
        ++i;
    }
    nStr[i]='\0';
    int length = i;
    i = 0;
    int j;
    while(i < length)
    {
        j = nStr[i]-'0';
        --nFlag[j];
        if(nFlag[j]!=0) 
        {
            --flag;
        }
        ++j;
        while(nFlag[j] > 0 && j < 10)
        {
            ++j;
        }
        if(j > 9)
        {
            ++i;
        }
        else
        {
            if(0 == flag)
            {
                nStr[i] = j+'0';
                ++nFlag[j]; 
                fillRest(nFlag,nStr,i); 
                return str2int(nStr);
            }
            else
            {
                ++i; 
            }
            
        }
        if(i == length)
        {
            nStr[i]='1';
            ++nFlag[1];
            nStr[i+1]='\0';
            fillRest(nFlag,nStr,i);
            return str2int(nStr);
        }
    }
} 

int main()
{
    cout<<upperUnique(8888888);
    return 0;
} 

 

你可能感兴趣的:(算法)