Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使两个数组具有相同值的最小数字更改数_Javascript_Arrays_Minimum - Fatal编程技术网

Javascript 使两个数组具有相同值的最小数字更改数

Javascript 使两个数组具有相同值的最小数字更改数,javascript,arrays,minimum,Javascript,Arrays,Minimum,我对编码还很陌生,我正在尽我最大的努力,但经过数小时的研究,我仍然无法理解这一点。我试图以最少的移动次数使这两个单独的数组相同。我一次只能用++或-,一个数字 这就是挑战: 不允许数字的重新排序,例如,考虑两个数组:安德列的 [123, 543 ] < /代码>和玛丽亚的 [321, 279 ] < /代码>。对于第一个数字,Andrea可以将1增加两次以达到3。2已经相等了。最后,她两次递减3等于1。她花了4步才达到目标。对于第二个整数,她递减5三次,递增4三次,递增3六次。转换第二个数组元素

我对编码还很陌生,我正在尽我最大的努力,但经过数小时的研究,我仍然无法理解这一点。我试图以最少的移动次数使这两个单独的数组相同。我一次只能用++或-,一个数字

这就是挑战:

不允许数字的重新排序,例如,考虑两个数组:安德列的<代码> [123, 543 ] < /代码>和玛丽亚的<代码> [321, 279 ] < /代码>。对于第一个数字,Andrea可以将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
}
a=[12344321]
设m=[23453214]
函数最小移动(a,m){
//在这里编写代码
设numMoves=0;
设num1='';
设num2='';
让digit1='';
让digit2='';
for(设i=0;i
在我看来,您应该创建一个有效地使用一位数的函数,当它大于其他需要递减的数字时,它会这样做:

const incrementWhileNeeded = (target, currentValue) =>
  Math.abs(target - currentValue)
然后,您需要将数字拆分为数字(您可以用数学方法使用
%
完成此操作,就像您所做的那样,但只是为了简单起见,类似于:
String(num1)。拆分(“”)。map(Number)
将需要451并将其更改为
[4,5,1]

然后,您的下一步是将该函数(incrementWhileNeeded)映射到每个数字:只需关注第一个数字(然后应用forEach或.map将该函数应用到所有数字)

这看起来像:
firstNumberArray.map(需要时递增)

它将以您解释的
[1,0,2]
响应

然后.reduce()这样就可以得到计数的总和。 因此,这将使用
[1,0,2]来减少。将((累加器,电流)=>累加器+电流)
减少到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)

为了只获取一个数字串到另一个数字串的计数,您可以在一个位置添加数字的绝对增量

函数计数(a、b){
返回数组.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
    }
}
a=[12344321]
b=[23453214]
函数最小移动(a,m){
设numMoves1=0,numMoves2=0;
设num1='',num2='';
设digit1='',digit2='';
//前进
for(设i=0;inumMoves2)
{
//答案是numMoves1
}否则如果(numMoves1numMoves2)
{
//答案是numMoves1
}else if(numMoves1
//此代码有效。。。。
//看看这个。。。。
公共班机
{
公共静态void main(字符串[]args){
整数[]a={12344321};
整数[]m={23453214};
整数numMoves1=0;
整数num1=0,num2=0;
整数digit1=0,digit2=0;
//前进
for(整数i=0;i0)
{
数字1=num1%10;
数字2=num2%10;
numMoves1+=Math.abs(digit1-digit2);
num1=(num1-digit1)/10;
num2=(num2-digit2)/10;
}
}
System.out.println(numMoves1);
}
}

以下是找到最小移动的解决方案,以匹配两个不同数组的每个元素

a=[12344321]
设m=[23453214]
函数最小移动(a,m){
//在这里编写代码
设numMoves=0;
设num1='';
设num2='';
让digit1='';
让digit2='';
for(设i=0;i控制台日志(最小移动(a,m));
我不清楚您想做什么。请添加更好的输入和预期输出的描述和示例,谢谢!您可以在数组初始化语句中自定义输入。请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题有解释的回答者通常更乐于助人,质量更好,更有可能吸引选票
/******************************************************************************

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