zoukankan      html  css  js  c++  java
  • 最小不重复数

    2014百度笔试题目:

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

    解法:

      思路,1、检测是否是重复数,

         2、如果不是重复数,进行++判断,是重复数,递归

                   不是重复数,找到,返回。

         3、是重复数,从第一次出现重复的位置,相同的数字第二个,做加一。

                   如19900,第二个9+1,为20000;递归

                    (最初考虑有错,考虑999,第一次得到1009,递归得到1019!!!!)需要减去重复位以后的数,即后面全变为0;

     1 #include<stdio.h>
     2 int minrepeatnum(int n,int flag)
     3 {
     4     int bit = 0;
     5     int tmp = n;
     6     int prev = -1;
     7     int cur;
     8     int lastbit = -1;
     9     prev = tmp % 10;
    10     
    11     //获取位数最高的重复数字
    12     while((tmp = tmp/10) != 0){
    13         cur = tmp % 10;
    14         if(cur == prev)
    15             lastbit = bit;
    16         prev = cur;
    17         bit++;
    18     }
    19     //如果用户输入的数字即为非重复数,则+1继续检测
    20     //如果递归内部得到的数字为非重复数,直接返回即可
    21     if(lastbit == -1 && flag == 0)
    22         return n;
    23     if(lastbit == -1 && flag == 1){
    24         return minrepeatnum(n+1,0);
    25     }
    26     bit = lastbit;
    27     tmp = 1;
    28     
    29     //将从最高位开始得到重复数字位+1,并将其后各位置0
    30     while(bit > 0){
    31         tmp *= 10;
    32         bit--;
    33     }
    34     n = n + tmp - n%tmp;
    35     return minrepeatnum(n,0);
    36 }
    37 int minrepeat(int n)
    38 {
    39     return minrepeatnum(n,1);
    40 }
    41 void main()
    42 {
    43     int n;
    44     while(1){
    45         printf("input n = ");
    46         scanf("%d",&n);
    47         printf("minrepeatnum = %d
    ",minrepeatnum(n));
    48     }
    49 }
  • 相关阅读:
    ivew-admin 导入excel
    ivew Upload 上传时附带的额外参数
    工厂方法模式
    简单工厂模式
    webpack (1)
    商品格子
    合同签名
    展示图片数组
    使用egg.js和egg-sequelize连接mysql
    egg 连接mysql 在mysql 插入数据
  • 原文地址:https://www.cnblogs.com/xiaoerhei/p/3679140.html
Copyright © 2011-2022 走看看