`

求大于A的最大不重复数

阅读更多
package chow;

/**
 * 有道难题,如果一个数字十进制表达时,不存在连续两位数字相等,
 * 则称之为“不重复数”。例如,105,1234和12121都是“不重复数”,
 * 而11,100和 1225不算。给定一个long类型数字A,返回大于A的最小“不重复数”。
 * @author chow
 * @date 2010-6-30
 */

public class NoRepetionNum {
    public static void main(String[] args){
        System.out.println("result: " + checkRepeatNum(54));
        System.out.println("result: " + checkRepeatNum(10));
        System.out.println("result: " + checkRepeatNum(9));
        System.out.println("result: " + checkRepeatNum(98));
        System.out.println("result: " + checkRepeatNum(21099));
        System.out.println("result: " + checkRepeatNum(99123));
        System.out.println("result: " + checkRepeatNum(1134567));
    }
   
    //返回第一对重复的数的第二位的位置,如没重复数返回-1
    public static int firstRepeatIndex(long num){
        String strNum = String.valueOf(num);
        int index = 0;
        while(index < strNum.length() - 1){
            if(strNum.charAt(index) == strNum.charAt(index + 1)){
                return index + 1;
            }
            index++;
        }
        return -1;
    }
   
    //返回大于Num的最小:不重复数
    public static long checkRepeatNum(long num){
        num++;
        String strNum = String.valueOf(num);
        int index = -1;
        while((index = firstRepeatIndex(Long.parseLong(strNum))) != -1){
            String toAdd = strNum.substring(0, index + 1);
            String newPre = String.valueOf(Long.parseLong(toAdd) + 1);
            strNum = newPre + strNum.substring(index + 1, strNum.length());
//            System.out.println(strNum);
            //有进位
            if(newPre.length() > toAdd.length()){
                continue;
            }else{
                //把剩余位换成0,1相间
                int tmp = 0;
                while(index < strNum.length() - 1){
                    newPre = newPre + tmp;
                    tmp ^= 1;
                    index++;
                }
                strNum = newPre;
                break;
            }
        }
        return Long.parseLong(strNum);
    }
}
 
分享到:
评论
2 楼 bosshida 2010-07-19  
javaxiang 写道
算法有误。

哪里有错了?可以给出个测试用例来吗?
1 楼 javaxiang 2010-07-16  
算法有误。

相关推荐

    求 两个数 的 最大公约数

    - 设两数为a和b(a&gt;b),求a和b的最大公约数。 - 用a除以b得到余数r。 - 若r=0,则b即为所求的最大公约数; - 若r≠0,则将b赋值给a,r赋值给b,重复以上步骤直到r=0为止。 ##### 2. 更相减损法 更相减损法是一种...

    单调递增子序列 最大连续子段和

    - 存储子问题的解避免重复计算。 **应用**: - 最大连续子段和问题可以通过动态规划来高效解决。 - 在解决此类问题时,需要定义合适的状态表示以及状态转移方程。 ### 5. 代码解析 #### 5.1 主函数 - `int main...

    辗转相除法求最大公约的方法

    通过反复执行这个过程,最终会得到一个余数为0,此时的除数即为所求的最大公约数。 算法的步骤如下: 1. 设有两个非负整数a和b,其中a大于等于b。 2. 使用a除以b,得到商q和余数r,即a = bq + r。 3. 如果r等于0,...

    算法 删数问题

    此外,代码中没有处理可能的边界情况,例如k大于实际数字个数等,实际应用中应添加适当的错误检查。 总的来说,这个算法实现了题目要求的功能,通过贪心策略有效地找到最小的删除方案。在实际编程中,我们可以根据...

    辗转求余.txt

    根据前两步的证明,我们知道S中最小的正数d能够整除a和b,而且d也是a和b的最大公约数,因为任何比d大的数都不能同时整除a和b。 #### 五、应用示例 假设我们有两个数12和8,按照辗转求余算法的步骤,我们可以得到...

    嵌入式小程序2

    2. 若两数不等,则将较大的数减去较小的数,再比较新的两个数,重复此过程直到两数相等为止。 #### 五、程序分析 给定的代码示例是使用汇编语言实现的辗转相除法求解两个数的最大公约数。下面是对这段代码的逐行...

    最大公约数辗转相除法

    4. **递归执行**:如果 k 不为 0,则将 n 的值赋给 m,k 的值赋给 n,然后重复第 3 步。 5. **返回结果**:当 k 为 0 时,m 即为所求的最大公约数。 #### 三、C++ 实现 下面是一个使用 C++ 编写的辗转相除法程序...

    算法:求第k小元素

    这种方法在元素范围小且不重复的情况下非常高效,但不适用于大规模和元素范围广的情况。 在实际应用中,选择哪种方法取决于具体的问题场景,包括数据的大小、元素的分布特点、对时间复杂度的要求以及是否允许额外的...

    用贪心算法求解删数问题

    这个问题可以通过贪心策略来解决,具体策略是优先删除最近下降点的数字,也就是连续数字序列中最大的那个数。这样每次删除都会使得剩下的数字序列变得更小,从而尽可能地减小最终结果。 算法的实现步骤如下: 1. ...

    概率论与数理统计浙大第四版习题答案.pdf

    概率的互补法则指出,事件A不发生的概率是1减去事件A发生的概率,即P(A') = 1 - P(A)。 5. 事件的独立性:如果两个事件A和B的联合概率等于它们各自概率的乘积,即P(AB) = P(A)P(B),那么事件A和B是独立的。该性质是...

    JAVA基础 第一篇:素数、合数、质数分解、最大公约数、最小公倍数.docx

    GCD是两个或多个非零整数的最大公共因子,而LCM则是最小的数,可以被这两个数整除。在Java中,我们可以使用欧几里得算法(Euclidean Algorithm)来计算GCD,该算法基于两个整数a和b的GCD等于b和a除以b的余数的GCD这...

    oracle下如何删除重复数据的几种方法

    如果想要查看哪些记录是不重复的,只需将`HAVING COUNT(*) &gt; 1`改为`HAVING COUNT(*) = 1`即可。 ##### 删除重复数据 对于重复的数据,可以通过以下方式删除: **方法1:直接删除** ```sql DELETE FROM 表名 a ...

    (完整版)六年级数学期末总复习数与代数知识点归纳及经典练习题.pdf

    * 求小数的近似数:根据要求保留小数位数,确定好从哪一位起按照“ 四舍五入”的方法省略尾数。 * 小数化成分数的方法:先把小数改写成分母是10,100,1000 ⋯ ⋯ 的分数,再约分,就化成了分数。 * 小数化成百分数的...

    2017年中国研究生数学建模竞赛A题

    - **时间间隔要求**: 为了确保区域内的地方相邻两次被巡查的时间间隔不大于3小时,需要进一步调整无人机的数量和飞行计划。 #### 五、问题二:生命迹象探测 **目标**: 使用无人机携带的生命探测仪覆盖尽可能大的...

    c代码-求3个数的中间值

    给定三个数a、b和c,中间值是指这三个数中既不大于另外两个数,也不小于另外两个数的那个数。如果它们按升序排列为a ≤ b ≤ c,那么b就是中间值。在可能存在重复数字的情况下,中间值可能是a、b或c中的任意一个。 ...

    java比较四个数的大小(二类个)

    - 每次比较时,如果前一个数大于后一个数,则交换它们的位置,直到所有数都按顺序排列。 3. **输出结果**:排序完成后,使用 `System.out.print` 输出排序后的结果。 - 输出格式为:“ĴСΪ” + x + “&lt;” + y +...

Global site tag (gtag.js) - Google Analytics