Java 程序不给出 n>6 值的输出,为什么?

Java Program does not give the output for values of n>6, Why?

import java.util.*;
class A{
   static int count=0;
   static String s;

   public static void main(String z[]){
      int n;
      Scanner sc=new Scanner(System.in);
      n=sc.nextInt();
      System.out.println(noOfBouncy(n));
   }

   public static int noOfBouncy(int k){
      int limit=(int)Math.pow(10,k);

       s=new String("1");
       int num=Integer.parseInt(s);
       while(num<limit){
          if(isIncreasing(s) || isDecreasing(s) ){
          }
          else{
            count++;
          }
          num++;
          s=new String(Integer.toString(Integer.parseInt(s)+1));
       }
       count=limit-count;
       return count; 
   }
}
public static boolean isIncreasing(String s){
     int len=s.length();
     for(int i=0;i<len-1;i++){
         if(s.charAt(i)>s.charAt(i+1)){
             return false;
         }
    }
return true;    
}
public static boolean isDecreasing(String s){
     int len=s.length();
     for(int i=0;i<len-1;i++){
         if(s.charAt(i)<s.charAt(i+1)){
             return false;
         }
    }
return true;
}

我已经给出了使用的两个函数 isIncreasing() 和 isDecresing() 的定义

对于 n<7 的值,程序运行良好,但对于高于它的值则不响应,为什么?

我接受编程风格很不成熟,请忽略。

我尝试用 n=7 执行它,它在 810 毫秒内完成,返回 30817。

但是,我建议您通过节省不必要的对象实例化来优化程序的性能:如果您在 num 中维护计数器并将其转换为字符串会更好 仅一次,在循环开始时:

    int num=1;
    while (num < limit)
    {
        s=Integer.toString(num);
        if (isIncreasing(s) || isDecreasing(s))
        {
        }
        else
        {
            count++;
        }
        num++;
    }

像这样只需要450ms就可以完成。

程序实际上并没有卡住,但是当 'n' 的值较大时,它花费了太多时间来完成它的执行。

所以现在的问题是,我需要优化代码以花费最少的时间@Little 的优化位还不够。

任何提示都将不胜感激。

为了提高性能,您应该避免与 String 对话并使用数字进行检查。

如果您从左到右或从右到左开始比较,结果并不重要,一个计算解决方案可能是。

伪代码

1) compare the value of the right most digit with the digit on it's left
2) is it lower --> we found a decreasing pair
3) else check if it is bigger --> we found an increasing pair
4) else --> not a bouncy pair
5) if we found already one decreasing and one increasing pair it's bouncy number
6) divide the number by ten if it's bigger then ten repeat with step 1)

检查它是否为弹性数字的方法可能如下所示

static boolean isBouncyNumber(int number) {

    boolean increasingNumber = false;
    boolean decreasingNumber = false;

    int previousUnitPosition = number % 10;
    int remainder = number / 10;

    while (remainder > 0) {
        // step 1
        int currentUnitPosition = remainder % 10;
        if (currentUnitPosition > previousUnitPosition) {
            // step 2
            decreasingNumber = true;
        } else if (currentUnitPosition < previousUnitPosition) {
            // step 3
            increasingNumber = true;
        }

        // step 5
        if (decreasingNumber && increasingNumber) {
            return true;
        }
        // step 6
        previousUnitPosition = currentUnitPosition;
        remainder = remainder / 10;
    }

    return decreasingNumber && increasingNumber;
}