3
votes

Nombre minimum de changements de chiffres pour que deux tableaux aient la même valeur

Je suis assez nouveau dans le codage et je fais de mon mieux, mais après des heures et des heures de recherche, je n'arrive toujours pas à comprendre. J'essaie de rendre ces deux tableaux séparés les mêmes avec le nombre minimum de mouvements. Je ne peux que ++ ou - un numéro à la fois.

Voici le défi:

Aucune réorganisation des chiffres n'est autorisée Par exemple, considérons deux tableaux: le [123, 543] d'Andrea et le [321] de Maria, 279] . Pour le premier chiffre, Andrea peut incrémenter le 1 deux fois pour obtenir 3. Les 2 sont déjà égaux. Finalement, elle décrémente ses 3 deux fois pour égaler 1. Il lui a fallu 4 mouvements pour atteindre son objectif. Pour le deuxième entier, elle décrémente 5 trois fois, incrémente 4 trois fois et 3 six fois. Il a fallu 12 mouvements pour convertir le deuxième élément du tableau. Au total, il a fallu 16 mouvements pour convertir les deux valeurs constituant le tableau complet.

let a = [1234, 4321]
let m = [2345, 3214]

function minimumMoves(a, m) {
    // Write your code here
    let numMoves = 0;
    let num1 = '' ;
    let num2 = '' ;
    let digit1 = '';
    let digit2= '';
    for (let i = 0; i < a.length; i++)
    {
        num1 = a[i]; 
        while (num1 != 0) {
            digit1 = num1 % 10; 
            digit2 = num2 % 10; 
            num1 = Math.trunc(num1 / 10); 
            num2 = Math.trunc(num2 / 10);
            numMoves = numMoves + Math.abs(digit1 - digit2);

        }
    }
    return numMoves
}


1 commentaires

Ce que vous essayez de faire n'est pas clair pour moi. veuillez ajouter une meilleure description et des exemples d'entrée et de sortie attendue, merci!


3 Réponses :


1
votes

À mon avis, vous devriez créer une fonction qui prend effectivement un seul chiffre et bien qu'il soit supérieur à l'autre nombre aka doit être décrémenté, il le fait:

const incrementWhileNeeded = (target, currentValue) =>
      Math.abs(target - currentValue)

const calculateMinimumMoves = (fullNumber, targetNumber) => {
      const numArray = String(fullNumber).split('').map(Number)
      const targetArray = String(targetNumber).split('').map(Number)
      const diffArray = numArray.map((currentElement, targetArray[index]) => incrementWhileNeeded(currentElement, targetArray[index])
      return diffArray.reduce((accumulator, current) => accumulator + current, 0)
}

const minimumMoves = (array1, array2) =>
      array1.reduce((accumulator, current, index) =>
            accumulator + calculateMinimumMoves(current, array2[index]),
            0)

Ensuite, vous avez besoin divisez les nombres en leurs chiffres (vous pouvez le faire de manière mathématique en utilisant % comme si vous aviez fait, mais juste pour simplifier quelque chose comme: String (num1) .split (' ') .map (Number) prendra 451 et le changera en [4, 5, 1] ​​.

Ensuite, votre prochaine étape consiste à mapper cette fonction (incrementWhileNeeded) à chaque chiffre individuel: concentrez-vous simplement sur le premier nombre (puis appliquez forEach ou .map pour appliquer cette fonction à tous.

Donc, cela ressemblera à quelque chose comme: firstNumberArray.map(incrementWhileNeeded)

Qui répondra comme vous l'avez expliqué [1, 0, 2] .

Ensuite .reduce () ceci afin que vous puissiez obtenir la somme des comptes. Cela réduira donc l'utilisation de [1,0,2] .reduce ((accumulator, current) => accumulator + current) à 3.

Donc, pour la fonctionnalité complète:

const incrementWhileNeeded = (target, currentValue) =>
  Math.abs(target - currentValue)


0 commentaires

2
votes

Pour obtenir uniquement le compte pour changer une chaîne de chiffres à une autre, vous pouvez ajouter le delta absolu des chiffres à un endroit.

function count(a, b) {
    return Array.from(a).reduce((s, v, i) => s + Math.abs(v - b[i]), 0);
}

console.log(count('123', '321'));


0 commentaires

0
votes

Vérifiez ce code:

/******************************************************************************

                            Online Java Compiler.
                Code, Compile, Run and Debug java program online.
Write your code in this editor and press "Run" button to execute it.

*******************************************************************************/

public class Main
{
    public static void main(String[] args) {
        Integer[] a = {1234, 4321};
        Integer[] m = {2345, 3214};
        Integer numMoves1 = 0, numMoves2 = 0;
        Integer num1 = 0, num2 = 0;
        Integer digit1 = 0, digit2 = 0;
        //Forward
        for (Integer i = 0 ; i < a.length ; i++)
        {
            num1 = a[i];
            num2 = m[i];
            for (Integer j = 0 ; j < a.length ; j++)
            {
                digit1 = num1 % 10;
                digit2 = num2 % 10;
                numMoves1 += Math.abs(digit1-digit2);
                num1 = (num1 - digit1) / 10;
                num2 = (num2 - digit2) / 10;
            }
        }
        //Backward
        for (Integer i = 0 ; i < a.length ; i++)
        {
            num1 = m[i];
            num2 = a[i];
            for (Integer j = 0 ; j < a.length ; j++)
            {
                digit1 = num1 % 10;
                digit2 = num2 % 10;
                numMoves2 += Math.abs(digit1-digit2);
                num1 = (num1 - digit1) / 10;
                num2 = (num2 - digit2) / 10;
            }
        }
        if (numMoves1>numMoves2)
        {
            //Answer is numMoves1
        } else if (numMoves1<numMoves2)
        {
            //Answer is numMoves2
        } else
        {
            //Answer is any one, i.e, either numMoves1 or numMoves2
        }
        System.out.println(numMoves1 + " & " + numMoves2);
    }
}

Si vous avez besoin d'une vérification rapide pour ce code, accédez à Ici .

Et puis collez ce code:

a = [1234, 4321]
b = [2345, 3214]

function minimumMoves(a, m) {
    let numMoves1 = 0, numMoves2 = 0;
    let num1 = '', num2 = '';
    let digit1 = '', digit2 = '';
    //Forward
    for (let i = 0 ; i < a.length ; i++)
    {
        num1 = a[i];
        num2 = m[i];
        for (let j = 0 ; j < a.length ; j++)
        {
            digit1 = num1 % 10;
            digit2 = num2 % 10;
            numMoves1 += Math.abs(digit1-digit2);
            num1 = (num1 - digit1) / 10;
            num2 = (num2 - digit2) / 10;
        }
    }
    //Backward
    for (let i = 0 ; i < a.length ; i++)
    {
        num1 = m[i];
        num2 = a[i];
        for (let j = 0 ; j < a.length ; j++)
        {
            digit1 = num1 % 10;
            digit2 = num2 % 10;
            numMoves2 += Math.abs(digit1-digit2);
            num1 = (num1 - digit1) / 10;
            num2 = (num2 - digit2) / 10;
        }
    }
    if (numMoves1>numMoves2)
    {
        //Answer is numMoves1
    } else if (numMoves1<numMoves2)
    {
        //Answer is numMoves2
    } else {
        //Answer is any one, i.e, either numMoves1 or numMoves2
    }
}

J'espère que cet algorithme vous aidera;)


1 commentaires

Vous pouvez personnaliser l'entrée dans l'instruction d'initialisation du tableau.