O ponto chave aqui é encontrar uma forma de descobrir os elementos que faltam. Um dos caminhos para conseguir isso é ordenando o array e verificando um por um para descobrir os que não estão lá.
Começamos então por ordenar o array com o método .sort(). Já vimos como ele funciona, apenas precisamos subtrair o segundo elemento do primeiro, caso o resultado seja positivo o primeiro elemento é maior e fica a frente, caso seja negativo, ele é menor e fica atrás. Mas antes de usar o .sort(), que modifica o array, podemos utilizar o .slice(0) para criar uma cópia desse array, para não modificarmos o array original. Como o problema nos informa que o último número nunca estará faltando, podemos obter o tamanho correto do array final convertendo o último elemento do array ordenado para número. Isso irá nos permitir criar um array que é exatamente como o array deveria ser, sem faltar nenhum número.
function missingPrisoners(prisoners) { const sorted = prisoners.slice(0).sort((a, b) => a - b)
const total = Number(sorted[sorted.length - 1])
const allPrisoners = []
for (let i = 0; i < total; i++) {
const prisoner = i + 1
allPrisoners.push(prisoner.toString().padStart(4, '0'))
}
}
De posse desse array de todos os prisioneiros, tudo que precisamos fazer agora é criar um array de prisioneiros que estão faltando e incluir nele todos os prisioneiros que não estão na lista original, mas estão na lista completa. Isso é possível através da negação do .includes() em cada elemento da lista completa. Por fim, basta retornamos a lista final dos prisioneiros que faltam.
function missingPrisoners(prisoners) {
const sorted = prisoners.slice(0).sort((a, b) => a - b)
const total = Number(sorted[sorted.length - 1])
const allPrisoners = []
for (let i = 0; i < total; i++) {
const prisoner = i + 1
allPrisoners.push(prisoner.toString().padStart(4, '0'))
}
const missing = []
allPrisoners.forEach(prisoner => {
if (!sorted.includes(prisoner)) {
missing.push(prisoner)
}
})
return missing
}