Boa noite,
estou treinando lógica em um site muito bom chamado Code Signal, onde o usuário é desafiado a resolver problemas de lógica com a maior eficiência possível.
Eu não faço faculdade e não tenho conhecimentos técnicos específicos, então vivo criando soluções não tão eficientes. Mas isso não o problema maior (até porque é por isso mesmo que estou praticando, para melhorar minha eficiência), o problema mesmo é que me vejo impossibilitado de resolver certas questões porque não possuo o conhecimento necessário.
Queria ajuda com nested loops (loops dentro de loops). Este é o segundo código que resolvo e que funciona corretamente, mas a solução não é aceita porque demora muito quando o input é imenso.
Eis o código:
boolean areSimilar(int[] a, int[] b) {
int[] tempA = Arrays.copyOf(a, a.length);
for (int k = 0; k < a.length - 1; k++) {
for (int i = 0; i < tempA.length; i++) {
tempA = Arrays.copyOf(a, a.length);
tempA[k] = a[i];
tempA[i] = a[k];
if (Arrays.equals(tempA, b))
return true;
}
}
return false;
}
A função dele é receber dois vetores de inteiros e dizer se é possível igualar o vetor A ao vetor B apenas trocando de posição dois elementos do vetor A.
Por exemplo, para os vetores A = {1, 2, 3}
e B = {2, 1, 3}
, pode-se igualá-los apenas trocando de posição os índices 0 e 1 do vetor A.
O código acima faz isso. Rodei os testes do site e todos resultaram o esperado. Porém quando o site testa inputs enormes, com A.length = 100000
, por exemplo, o tempo de execução vai às alturas.
Não consigo pensar em alguma forma de otimizar este código, nem achei alguma solução na rede.
Alguém pode me ajudar?