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?
- 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; }
- 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; }
- 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; }
- 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; }
- 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