【问题标题】:Minimum number of digit changes to get two arrays to have the same value使两个数组具有相同值的最小位数更改
【发布时间】:2019-08-06 22:40:10
【问题描述】:

我对编码很陌生,我正在尽力而为,但经过数小时的研究,我仍然无法弄清楚这一点。我正在尝试以最少的移动次数使这两个单独的数组相同。我一次只能 ++ 或 -- 一个数字。

这是挑战:

不允许对数字重新排序 例如,考虑两个数组: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
}

【问题讨论】:

  • 我不清楚您要做什么。请添加更好的描述和输入和预期输出示例,谢谢!

标签: javascript arrays minimum


【解决方案1】:

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

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) =&gt; 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
          }
      }
      

      如果您需要快速验证此代码,请导航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);
          }
      }
      

      我希望这个算法有所帮助;)

      【讨论】:

      • 可以在数组初始化语句中自定义输入。
      【解决方案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);
          }
      }
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
      【解决方案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));

      【讨论】:

        猜你喜欢
        • 2020-12-24
        • 1970-01-01
        • 2022-01-17
        • 2020-08-22
        • 2014-02-03
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多