使两个数组具有相同值的最小数字更改次数
Minimum number of digit changes to get two arrays to have the same value
我对编码还很陌生,我正在尽我最大的努力,但经过数小时的研究,我仍然无法弄清楚这一点。我试图用最少的移动次数使这两个独立的数组相同。我一次只能 ++ 或 -- 一个数字。
这是挑战:
不允许对数字重新排序 例如,考虑两个数组:Andrea 的 [123, 543]
和 Maria 的 [321, 279]
。对于第一个数字,Andrea 可以将 1 递增两次以获得 3。2 已经相等。最后,她将 3 递减两次等于 1。完成她的目标需要 4 步。对于第二个整数,她将 5 递减 3 次,将 4 递增 3 次,将 3 递增 6 次。转换第二个数组元素用了 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
}
在我看来,你应该创建一个有效地接受一位数的函数,虽然它大于另一个数字,也就是需要递减,但它是这样做的:
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)
为了仅获取将一串数字更改为另一串数字的计数,您可以在某个位置添加数字的绝对增量。
function count(a, b) {
return Array.from(a).reduce((s, v, i) => s + Math.abs(v - b[i]), 0);
}
console.log(count('123', '321'));
查看此代码:
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
}
}
如果您需要快速验证此代码,请导航 Here。
然后粘贴这段代码:
/******************************************************************************
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);
}
}
希望这个算法能帮到你 ;)
//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);
}
}
这里是寻找最小步数以匹配两个不同数组的每个元素的解决方案。
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));
我对编码还很陌生,我正在尽我最大的努力,但经过数小时的研究,我仍然无法弄清楚这一点。我试图用最少的移动次数使这两个独立的数组相同。我一次只能 ++ 或 -- 一个数字。
这是挑战:
不允许对数字重新排序 例如,考虑两个数组:Andrea 的 [123, 543]
和 Maria 的 [321, 279]
。对于第一个数字,Andrea 可以将 1 递增两次以获得 3。2 已经相等。最后,她将 3 递减两次等于 1。完成她的目标需要 4 步。对于第二个整数,她将 5 递减 3 次,将 4 递增 3 次,将 3 递增 6 次。转换第二个数组元素用了 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
}
在我看来,你应该创建一个有效地接受一位数的函数,虽然它大于另一个数字,也就是需要递减,但它是这样做的:
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)
为了仅获取将一串数字更改为另一串数字的计数,您可以在某个位置添加数字的绝对增量。
function count(a, b) {
return Array.from(a).reduce((s, v, i) => s + Math.abs(v - b[i]), 0);
}
console.log(count('123', '321'));
查看此代码:
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
}
}
如果您需要快速验证此代码,请导航 Here。
然后粘贴这段代码:
/******************************************************************************
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);
}
}
希望这个算法能帮到你 ;)
//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);
}
}
这里是寻找最小步数以匹配两个不同数组的每个元素的解决方案。
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));