FC ConcursosFC Concursos

Questão FC213567

Qual método executa o que foi especificado?

Linguagens de Programação

CESGRANRIO · 2024

Um programador criou um método Java que recebe como parâmetro um inteiro maior ou igual a zero e retorna um inteiro cujos dígitos têm suas posições invertidas em relação ao inteiro recebido como parâmetro, conforme os exemplos apresentados a seguir:

 
  • Caso essa função receba o inteiro 1234 como parâmetro, ela retornará o inteiro 4321;
  • Caso essa função receba o inteiro 1000 como parâmetro, ela retornará o inteiro 1;
  • Caso essa função receba o inteiro 8 como parâmetro, ela retornará o inteiro 8.
 

Qual método executa o que foi especificado?

  1. import java.util.Stack; // presente no arquivo

         public static int inverte(int num) {          Stack<Integer> pilha = new Stack<Integer>();

     

             do {              int resto = num % 10;              num /= 10;              pilha.push(resto);          } while(num > 0);

     

             for (int i=1; ! pilha.isEmpty(); i*=10)               num += pilha.pop() * i;

     

             return num;       }

  2. import java.util.LinkedList; // presente no arquivo      import java.util.Queue; // presente no arquivo

         public static int inverte(int num) {          Queue<Integer> fila = new LinkedList<Integer>();

     

             for ( ; num > 0; ) {              int resto = num % 10;              num /= 10;              fila.offer(resto);         }

            for (int i=1; ! fila.isEmpty(); i*=10)             num += fila.poll() * i;

     

            return num;      }

  3. import java.util.LinkedList; // presente no arquivo      import java.util.Queue; // presente no arquivo

         public static int inverte(int num) {          Queue<Integer> fila = new LinkedList<Integer>();

     

            do {             int resto = num % 10;             num /= 10;             fila.offer(num);        } while(num > 0);

     

           for (int i=1; ! fila.isEmpty(); i*=10)            num += fila.poll() * i;

           return num;      }

  4. import java.util.LinkedList; // presente no arquivo      import java.util.Queue; // presente no arquivo

         public static int inverte(int num) {         Queue<Integer> fila = new LinkedList<Integer>();

            while (num > 0) {              int resto = num % 10;              num /= 10;              fila.offer(resto);         }         for (int i=1; ! fila.isEmpty(); i*=10)              num += fila.poll() * i;

           return num;      }

  5. import java.util.Stack; // presente no arquivo

          public static int inverte(int num) {           Stack<Integer> pilha = new Stack<Integer>();

              while(num > 0) {                int resto = num % 10;                num /= 10;                pilha.push(num);      }

     

              for (int i=1; ! pilha.isEmpty(); i*=10)               num += pilha.pop() * i;

              return num;     }

Mostrar resposta e comentário

Gabarito

A

Comentário do professor

Esta é a alternativa correta.

O método usa uma pilha (Stack) para inverter a ordem dos dígitos. Na primeira parte, com o laço do…while, ele extrai repetidamente o último dígito via \(resto = num \% 10\) e faz \(num /= 10\), empurrando cada resto na pilha.

Como a pilha é LIFO (Last In, First Out), ao desempilhar os valores eles saem na ordem inversa da extração, ou seja, os dígitos ficam invertidos.

Na segunda parte, o método recolhe os dígitos com um multiplicador que cresce por potências de 10 (variável \(i\) iniciando em 1 e multiplicada por 10 a cada iteração), acumulando \(num += pilha.pop() * i\). Assim o primeiro dígito desempilhado ocupa a casa das unidades, o seguinte a casa das dezenas, e assim por diante.

Observações práticas: o uso de do…while garante que mesmo \(num=0\) seja processado corretamente (empurra 0 na pilha e retorna 0). Trailing zeros em números como 1000 são descartados no resultado porque aparecem como zeros nas casas de maior peso ao reconstruir o número, resultando em 1, conforme esperado.

Complexidade: tempo e espaço são lineares no número de dígitos do inteiro, ou seja, \(O(d)\), onde \(d\) é a quantidade de dígitos.

Conteúdo do catálogo FC Concursos · Atualizado em

Continue aprendendo