步进号码程序

时间:2014-12-22 02:19:06

标签: algorithm

我有以下问题:

  

步数:

     

如果每个相邻的数字(以逗号分隔)相差1,则一个数字称为步进数。步数不能是1位数,必须至少是2位数。例如, 45 8,343,545 是步进数字。   但是, 890,098 不是。 “9”和“0”之间的区别应该是   不被视为1.

     

根据起始编号 s 和结束编号 e ,您的功能应列出   输出范围内的所有步数,包括数字 s   &安培;的 ë

我的尝试

public void steppingNumber(int s, int e) {
    while(s <= e) {
        String str = Integer.parseInt(s);
        if(isSteppingNumber(str)) System.out.print(str + " ");
        s++;
    }
}

public boolean isSteppingNumber(String str) {
    if(str.length() == 1) return false; // 1-digit number can't be a stepping number

    List<String> numbers = new ArrayList<>();

    while(str.length() >= 3) { // get every 3-digit comma-separated number
        numbers.add(str.substring(str.length()-3));
        str = str.substring(0,str.length()-3);
    }
    numbers.add(str); // Also get the last number left

    for(String num : numbers) { // for every 3-digit comma-separated number, check if it's a stepping number
        for(int i = 1; i < num.length(); i++) {
            int previousDigit = Character.getNumericValue(num.charAt(i-1));
            int currentDigit = Character.getNumericValue(num.charAt(i));

            if(Math.abs(previousDigit - currentDigit) != 1) return false;
        }
    }

    return true;
}

如果问题只是检查一个数字是否是一个步数,我认为我的解决方案没问题。但是,如果我应该列出范围内的所有步进数字​​,比如1到10 ^ 15,那么我的解决方案将运行线性时间,不管检查部分。谁能为给定的问题提供更好的解决方案?

1 个答案:

答案 0 :(得分:2)

您可以尝试在 [s,e] 中打印每个步进号码,而不是检查 [s,e] 中的每个数字。

应该看起来像:

  1. 生成一个3位数的步进数字列表,其值为[000,999]
  2. 通过在新列表中添加1到9创建另一个列表(对于逗号之前的最左边部分),然后添加列表1中的所有元素
  3. 找出大于或等于s的最小步进数,并检查步进数是否在 [s,e]
  4. 生成步进数(通过使用列表1和列表2),直到值大于e

  5. <强>备注

    列表1包含010和012,但排除值以0开头,但不包括01,如045(即使45本身也是有效值)

    s和/或小于或等于2位数的e可能需要专门处理。