Troca-troca 2
Agora imagine que a tarefa é a seguinte
Trocar o segundo maior elemento e o segundo menor elemento de lugar
No exemplo acima, isso nos daria
L
Agora imagine que a tarefa é a seguinte
No exemplo acima, isso nos daria
L
0 | 1 |
|
|
||||||
---|---|---|---|---|---|---|---|---|---|
17 | 10 | 42 | 15 | 30 | 9 | 6 | 20 | 16 | 25 |
Apresente um programa que realiza essa tarefa.
Nota: Você pode assumir que todos os elementos da lista são diferentes.
Nota: Você pode assumir que todos os elementos da lista são diferentes.
Passo 1
Beleza, a questão pede um programa que recebe uma lista de números (todos diferentes) e troca de lugar o segundo menor com o segundo maior.
Conteúdo: manipulação de arrays/listas, laços (
O que vamos precisar:
Conteúdo: manipulação de arrays/listas, laços (
for
), comparação de valores e troca de variáveis (swap).O que vamos precisar:
- Percorrer a lista pra achar o menor e o maior;
- Percorrer de novo pra achar o segundo menor e o segundo maior (ignorando o menor e o maior);
- Fazer o “swap” desses dois.
Passo 2
Primeiro vamos achar o menor e o maior elemento da lista.
– Inicializa
– Para cada índice :
– Inicializa
min_val = arr[0]
, min_idx = 0
, max_val = arr[0]
, max_idx = 0
.– Para cada índice
- se
arr[i] < min_val
, atualizamin_val = arr[i]
emin_idx = i
; - se
arr[i] > max_val
, atualizamax_val = arr[i]
emax_idx = i
.
No fim desse laço a gente sabe onde está o menor e onde está o maior.
Passo 3
Agora achamos o segundo menor e o segundo maior.
– Inicializa
– Para cada :
– Inicializa
second_min_val = +∞
, second_min_idx = -1
;second_max_val = -∞
, second_max_idx = -1
.– Para cada
- se
arr[i] ≠ min_val
earr[i] < second_min_val
:
atualizasecond_min_val = arr[i]
,second_min_idx = i
; - se
arr[i] ≠ max_val
earr[i] > second_max_val
:
atualizasecond_max_val = arr[i]
,second_max_idx = i
.
Isso garante que a gente pegue o “próximo depois” do menor e do maior.
Passo 4
Fazemos a troca (swap) entre os dois índices:
temp = arr[second_min_idx]
arr[second_min_idx] = arr[second_max_idx]
arr[second_max_idx] = temp
Pronto, o segundo menor foi para onde o segundo maior estava, e vice-versa.
Passo 5
Só imprimir ou retornar a lista modificada.
Passo 6
min_val, min_idx = arr[0], 0
max_val, max_idx = arr[0], 0
for i in range(1, n):
if arr[i] < min_val:
min_val, min_idx = arr[i], i
if arr[i] > max_val:
max_val, max_idx = arr[i], i
max_val, max_idx = arr[0], 0
for i in range(1, n):
if arr[i] < min_val:
min_val, min_idx = arr[i], i
if arr[i] > max_val:
max_val, max_idx = arr[i], i
Passo 7
second_min_val, second_min_idx = float(‘inf’), -1
second_max_val, second_max_idx = float(’-inf’), -1
for i in range(n):
if arr[i] != min_val and arr[i] < second_min_val:
second_min_val, second_min_idx = arr[i], i
if arr[i] != max_val and arr[i] > second_max_val:
second_max_val, second_max_idx = arr[i], i
second_max_val, second_max_idx = float(’-inf’), -1
for i in range(n):
if arr[i] != min_val and arr[i] < second_min_val:
second_min_val, second_min_idx = arr[i], i
if arr[i] != max_val and arr[i] > second_max_val:
second_max_val, second_max_idx = arr[i], i
Passo 8
temp = arr[second_min_idx]
arr[second_min_idx] = arr[second_max_idx]
arr[second_max_idx] = temp
arr[second_min_idx] = arr[second_max_idx]
arr[second_max_idx] = temp
return arr
Exemplo de uso:
lista = [17, 10, 42, 15, 30, 9, 6, 20, 16, 25]
print(troca_segundo_menor_maior(lista))
print(troca_segundo_menor_maior(lista))
Saída: [17, 10, 42, 15, 9, 30, 6, 20, 16, 25]
Resposta
def troca_segundo_menor_maior(arr):
n = len(arr)