【问题标题】:Digit increment in Array数组中的数字增量
【发布时间】:2020-05-26 23:48:21
【问题描述】:

我想递增 (+1) 具有 N 个值并表示整数的 int 数组的最后一位。每个值都是 0-9 之间的单个数字。

逻辑是这样的:如果要增加的数字是9,它必须变成0,并且下一个(从右到左)必须增加1。如果你到达第一个数字数组,它是 9,这将变成 10。示例:

[3,4,5,6] -> [3,4,5,7]  
[3,9,2,9] -> [3,9,3,0]  
[3,4,9,9] -> [3,5,0,0]  
[9,9,9,9] -> [10,0,0,0]  

我有同样的练习,但只有 4 个数字,所以逻辑很简单:

int[] incrementArrayDigits(int[] fourDigits) {

    if (fourDigits[3] != 9) {
        fourDigits[3]++;
    } else if (fourDigits[2] != 9) {
        fourDigits[3] = 0;
        fourDigits[2]++;
    } else if (fourDigits[1] != 9) {
        fourDigits[3] = 0;
        fourDigits[2] = 0;
        fourDigits[1]++;
    } else if (fourDigits[0] != 9) {
        fourDigits[3] = 0;
        fourDigits[2] = 0;
        fourDigits[1] = 0;
        fourDigits[0]++;
    }

    if (fourDigits[0] == 9 && fourDigits[1] == 9 && fourDigits[2] == 9 && 
        fourDigits[3] == 9) {
        fourDigits[1] = fourDigits[2] = fourDigits[3] = 0;
        fourDigits[0] = 10;
    }

    System.out.println(Arrays.toString(fourDigits));
    return fourDigits;
}

我试图解决 N 个数字的问题,获取数组的长度,然后使用 for 循环,但我无法达到预期的结果。

【问题讨论】:

  • 提示:保留要递增的数组元素的索引,从array.length - 1 开始。在循环中,要么递增(然后中断),要么设置为 0 并减少索引。如果索引最终为负数,那么您已经经历了所有排列...
  • 请向我们展示您尝试实现的循环。
  • 想想如何在纸上做长加法。从最右边的数字开始,添加,如果需要,携带一个,然后转到下一个数字。请记住,您可能需要在末尾添加一个额外的数字作为最高有效数字(最左边)。
  • 这是探索递归奇迹的绝佳例子。

标签: java arrays


【解决方案1】:

解决这个问题的一种方法是使用递归。

这个想法是跟踪您正在递增的数组的哪个元素。您从索引array.length - 1 处的元素开始,递增它,如果达到10,将其设置为0,然后对索引array.length - 2 处的元素执行相同的操作,依此类推。

还要注意,由于您在方法中更改数组,因此不必返回数组。

private static void incrementArrayDigits(int[] array, int position) {
    if (position >= array.length || position < 0) {
        return;
    }
    array[position]++;
    if (array[position] == 10 && position != 0) {
        array[position] = 0;
        incrementArrayDigits(array, position - 1);
    }
}

// usage:

int[] array = {9,9,9};
incrementArrayDigits(array, array.length - 1);
System.out.println(Arrays.toString(array));

【讨论】:

    【解决方案2】:

    其实你真正想要达到的是“PLUS 1”。如果您的 N

    当然,如果你的N真的需要很大。尝试为数字实现一个类?

    【讨论】:

      【解决方案3】:

      一种可能的解决方案是在您的数组上向后迭代并在需要时递增:

      private static int[] incrementArrayDigits(int[] fourDigits) {
          for (int i = fourDigits.length - 1; i >= 0; i--) {
              fourDigits[i]++; // increment
              if (i > 0) { // cut result to 0-9, if not the first value
                  fourDigits[i] %= 10;
              }
              if (fourDigits[i] > 0) { // if no carry is passed break
                  break;
              }
          }
          return fourDigits;
      }
      

      【讨论】:

        【解决方案4】:

        这是我想出的解决方案。希望对您有所帮助!

        public void incrementArrayDigits(int[] arr) {
            if(arr == null)
                return;
            int currIndex = arr.length - 1;
            while(currIndex > -1){
                arr[currIndex]++;
                if(arr[currIndex] < 10)
                    return;
                else if (currIndex < 1)
                    return;
                else
                    arr[currIndex--] = 0;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-22
          • 2016-06-28
          • 2015-11-13
          相关资源
          最近更新 更多