-1

During execution the problem is giving stack overflow problem, but what is this!

Runtime Error (NZEC)

Exception in thread main java.lang.StackOverflowError at sun.nio.cs.US_ASCII$Encoder.encodeArrayLoop(US_ASCII.java:198) at sun.nio.cs.US_ASCII$Encoder.encodeLoop(US_ASCII.java:231) at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) at java.io.PrintStream.write(PrintStream.java:526) at java.io.PrintStream.print(PrintStream.java:669) at Solution.solve(Solution.java:22) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:27) at Solution.solve(Solution.java:23) at Solution.solve(Solution.java:27) at Solution.solve(Solution.java:23)

import java.util.*;
public class Solution {
    
    public static void printIncreasingNumber(int n) {
        /* Your class should be named Solution.
         * Don't write main() function.
        * Don't read input, it is passed as function argument.
        * Print output as specified in the question
        */
        int k = 10;
        int N = (int)Math.pow(10,n);//limit
        solve((int)Math.pow(10,n-1),N);
    }
    
    
    static void solve(int j,int n){
        if(j==n){
            return;
        }
        
        if(check(j)){
            System.out.print(j+" ");
            solve(j+1,n);
        }
        else{
            j = increase(j,n);
            solve(j,n);
        }
    }
    
    static boolean check(int k){
        ArrayList<Integer> arr = new ArrayList<>();
        int temp = k;
        while(temp>0){
            arr.add(temp%10);
            temp = temp/10;
        }
        boolean ans = true;
        for(int i=0;i<arr.size()-1;i++){
            if(arr.get(i)<=arr.get(i+1)){
                ans = false;
                return ans;
            }
        }
        return ans;
    }
    
    static int increase(int j,int n){
        int ans = 0;
        for(int i = j;i<n;i++){
            ArrayList<Integer> arr1 = new ArrayList<>();
            int temp = i;
            while(temp>0){
                arr1.add(temp%10);
                temp = temp/10;
            }
            int count = 0;
            for(int i1=0;i1<arr1.size()-1;i1++){
                if(arr1.get(i1)<=arr1.get(i1+1)){
                    count++;
                }
            }
            if(count==0){
                ans = i;
                break;
            }
        }
        return ans;
    }
}

My main function is,

import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        int a;
        Scanner s = new Scanner(System.in);
        a = s.nextInt();
        Solution.printIncreasingNumber(a);
    }

}
Slava Vedenin
  • 58,326
  • 13
  • 40
  • 59
ayan pal
  • 9
  • 1

1 Answers1

0

You have several problems in your code:

  1. Instead of if(j==n){ you should use if(j>=n){

  2. It look like function increase has bug, due to this function returns same number or 0 (it is a quite strange for increase function, isn't?). For example, if you call printIncreasingNumber(2), when j = 90 this function returns 0 and you have infinitive loop (you call solve function again and again from 0 till 90),

P.S. I recommend you use any Java debbuger for checking, then you can see all numbers step by step.

Slava Vedenin
  • 58,326
  • 13
  • 40
  • 59