TÓPICO

Wrong 100% - Java

chiga0 perguntou 4 years ago

  try {
            //Se o arquivo possui menos que 1 linha ou mais que 10000, return 
            LineNumberReader lineNumber = new LineNumberReader(new FileReader(filePath));

            lineNumber.skip(new File(filePath).length());

            if(lineNumber.getLineNumber() < 1 || lineNumber.getLineNumber() > 10000) {
                return;
            }

            //Leitura das expressões
            BufferedReader fileBuffer = new BufferedReader(new FileReader(filePath));
            String fileLine = "";

            Stack<Character> stack = new Stack<Character>();
            int contador = 0;
            boolean firstCloseFlag = false;

            while((fileLine = fileBuffer.readLine()) != null) {
                if(fileLine.length() > 1000) {
                    return;
                } else {
                    contador = 0;
                    firstCloseFlag = false;

                    for(int i=0; i < fileLine.length(); i++){
                        stack.push(fileLine.charAt(i));

                        if(stack.peek() == '('){
                            contador++;
                        } else if(stack.peek() == ')'){
                            contador--;
                        }

                        if(contador < 0) {
                            firstCloseFlag = true;
                        }

                        stack.pop();
                    }

                    if(firstCloseFlag) {
                        System.out.println("incorrect");
                    } else if(contador == 0){
                        System.out.println("correct");
                    } else {
                        System.out.println("incorrect");
                    }

                }
            }
        } catch (IOException e) {
            System.out.println(e);
        }

Lembre de não publicar soluções. Sua publicação pode ser revisada por nossos moderadores.

  • chiga0 respondido 4 years ago

    Criei este segundo algorítmo abaixo, mas o mesmo continua dando wrong answer 100%. Criei novos casos de teste e os mesmos deram certo. A validação ignora caracteres que não sejam '(' ou ')'...

    Desde já, agradeço a atenção.

  • chiga0 respondido 4 years ago

    try {
                //Se o arquivo possui menos que 1 linha ou mais que 10000, return 
                LineNumberReader lineNumber = new LineNumberReader(new FileReader(filePath));
    
                lineNumber.skip(new File(filePath).length());
    
                if(lineNumber.getLineNumber() < 1 || lineNumber.getLineNumber() > 10000) {
                    return;
                }
    
                //Leitura e validação das expressões
                BufferedReader fileBuffer = new BufferedReader(new FileReader(filePath));
    
                Stack<Character> stack = new Stack<Character>();
                boolean alreadyIncorrectFlag = false;
                String expression = "";
                String answer = "";
    
                while((expression = fileBuffer.readLine()) != null) {
                    //Se a expressão possuir mais que 1000 caracteres, return
                    if(expression.length() > 1000) {
                        return;
                    } else {
                        //Valida a expressão
                        stack.clear();
                        alreadyIncorrectFlag = false;
    
                        for(int i=0; i < expression.length(); i++){
                            if(expression.charAt(i) == ')' && stack.isEmpty()) {
                                answer = "incorrect";
                                alreadyIncorrectFlag = true;
                                i = expression.length();
                            } else if(expression.charAt(i) == '(') {
                                stack.push(expression.charAt(i));
                            } else if(expression.charAt(i) == ')') {
                                stack.pop();
                            }
                        }
    
                        if(alreadyIncorrectFlag == false) {
                            if(stack.isEmpty()) {
                                answer = "correct";
                            } else {
                                answer = "incorrect";
                            }                       
                        }
    
                        System.out.println(answer);     
                    }
                }
            } catch (IOException e) {
                System.out.println(e);
            }
  • chiga0 respondido 4 years ago

    Funcionou nos casos de teste do enunciado e em outros mais. Não consegui encontrar falha na lógica. Não vi necessidade de usar pilha, mas como o problema é de 'stack', presumi que o uso de pilha fosse obrigatório.

    Primeiramente, valida se o arquivo tem mais de 10000 linhas, levando em consideração que não se aceitaria mais de uma expressão por linha. Caso tenha mais de 10000 linhas, dá um 'return' e para a execução. Após, valida se a expressão a ser analisada tem mais de 1000 caracteres. Se não tiver, é exibida a resposta 'correct' ou 'incorrect'. Caso a expressão tenha mais de 1000 linhas, dá um 'return' e para a execução. As expressões anteriores à incorreta tem a sua resposta exibida. Alguma ideia de qual seria o erro do meu algorítmo? Desde já, agradeço.