Минимальное количество изменений цифр, чтобы два массива имели одинаковое значение

#javascript #arrays #minimum

#javascript #массивы #минимальное

Вопрос:

Я довольно новичок в кодировании и стараюсь изо всех сил, но после многих часов исследований я все еще не могу понять это. Я пытаюсь сделать эти два отдельных массива одинаковыми с минимальным количеством ходов. Я могу только или — по одному числу за раз.

Это проблема:

Изменение порядка цифр не допускается, например, рассмотрим два массива: Андреа [123, 543] и Марии [321, 279] . Для первой цифры Андреа может увеличить 1 дважды, чтобы получить 3. 2 уже равны. Наконец, она дважды уменьшает свои 3 до 1. Для достижения ее цели потребовалось 4 хода. Для второго целого числа она уменьшает 5 в три раза, увеличивает 4 в три раза и 3 в шесть раз. Потребовалось 12 ходов, чтобы преобразовать второй элемент массива. В общей сложности потребовалось 16 ходов, чтобы преобразовать оба значения, составляющие полный массив.

 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. Мне не ясно, что вы пытаетесь сделать. пожалуйста, добавьте лучшее описание и примеры ввода и ожидаемого результата, спасибо!

Ответ №1:

Чтобы получить только количество при замене одной строки цифр на другую, вы могли бы добавить абсолютную дельту цифр в определенном месте.

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

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

Ответ №2:

На мой взгляд, вам следует создать функцию, которая эффективно принимает одну цифру, и хотя она больше, чем другое число, которое необходимо уменьшить, она делает это:

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

Затем вам нужно разделить числа на их цифры (вы можете сделать это математическим способом, используя % как это выглядит, как вы сделали, но просто для простоты что-то вроде: String(num1).split('').map(Number) возьмет 451 и изменит его на [4, 5, 1] .

Затем ваш следующий шаг — сопоставить эту функцию (incrementWhileNeeded) с каждой отдельной цифрой: просто сосредоточьтесь на первом числе (и затем примените forEach или .map, чтобы применить эту функцию ко всем из них.

Таким образом, это будет выглядеть примерно так: firstNumberArray.map(incrementWhileNeeded)

Который ответит, как вы объяснили [1, 0, 2] .

Затем .reduce() это так, чтобы вы могли получить сумму подсчетов. Таким образом, это сократит использование [1,0,2].reduce((accumulator, current) => accumulator current) до 3.

Итак, для полной функциональности:

 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)
  

Ответ №3:

Проверьте этот код:

 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
    }
}
  

Если вам нужна быстрая проверка для этого кода, перейдите сюда.

А затем вставьте этот код:

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

                            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   " amp; "   numMoves2);
    }
}
  

Я надеюсь, что этот алгоритм поможет 😉

Комментарии:

1. Вы можете настроить ввод в инструкции инициализации массива.

Ответ №4:

 //This code works....
// Check this out ....
public class Main
{
    public static void main(String[] args) {
        Integer[] a = {1234, 4321};
        Integer[] m = {2345, 3214};
        Integer numMoves1 = 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];
           while(num1>0)
            {
                digit1 = num1 % 10;
                digit2 = num2 % 10;
                numMoves1  = Math.abs(digit1-digit2);
                num1 = (num1 - digit1) / 10;
                num2 = (num2 - digit2) / 10;
            }
        }
        System.out.println(numMoves1);
    }
}
  

Комментарии:

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества, и с большей вероятностью получат положительные отзывы

Ответ №5:

Вот решение для нахождения минимальных перемещений, чтобы соответствовать каждому из элементов двух разных массивов.

 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]; 
        num2 = m[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;
}

console.log(minimumMoves(a, m));