#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));