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
0 1 cdots n-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.

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 (for), comparação de valores e troca de variáveis (swap).
O que vamos precisar:
  1. Percorrer a lista pra achar o menor e o maior;
  2. Percorrer de novo pra achar o segundo menor e o segundo maior (ignorando o menor e o maior);
  3. Fazer o “swap” desses dois.

Passo 2

Primeiro vamos achar o menor e o maior elemento da lista.
– Inicializa min_val = arr[0], min_idx = 0, max_val = arr[0], max_idx = 0.
– Para cada índice :
  • se arr[i] < min_val, atualiza min_val = arr[i] e min_idx = i;
  • se arr[i] > max_val, atualiza max_val = arr[i] e max_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 second_min_val = +∞, second_min_idx = -1;
second_max_val = -∞, second_max_idx = -1.
– Para cada :
  • se arr[i] ≠ min_val e arr[i] < second_min_val:
    atualiza second_min_val = arr[i], second_min_idx = i;
  • se arr[i] ≠ max_val e arr[i] > second_max_val:
    atualiza second_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

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

Passo 8

temp = arr[second_min_idx]
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))

Saída: [17, 10, 42, 15, 9, 30, 6, 20, 16, 25]

Resposta

def troca_segundo_menor_maior(arr):
    n = len(arr)

Exercícios relacionados