• 最小不重复数


    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 }
  • 相关阅读:
    Oracle 11G单机 无网络环境静默安装
    Centos 7 编译安装llvm 8.0.0
    linux下测试读写
    Linux 初始化 init 系统(1):sysvinit
    自动挂载文件/etc/fstab功能详解
    虚拟机安装LINUX网络配置注意的问题
    rhel7报错整理
    16/4/4二代支付硬盘故障处理
    RedHat Enterprise Linux 7关闭防火墙方法
    Linux命令之awk数组使用范例
  • 原文地址:https://www.cnblogs.com/xiaoerhei/p/3679140.html
Copyright © 2020-2023  润新知