将整数数组折叠成两半

时间:2017-06-09 16:47:23

标签: java

我正在研究一种方法,该方法将采用整数数组并将其折叠半个x次。这个方法将采用像{1,2,3,4,5}这样的整数数组,如果折叠一次,则输出数组{6,6,3}。或者输入{5,6,7,8}和输出{13,13}也可以折叠一次。

如果输入折叠两次,则{5,6,7,8}将变为{26}。

import java.util.Arrays;
public class Kata
{
  public static int[] foldArray(int[] array, int runs)
  { 
    int[] tempArray = array;

    for(int j=0; j<runs; j++){
      for(int i=0; i<tempArray.length; i++){
        tempArray[i] += tempArray[tempArray.length - i];
      }
    }

    int[] outputArray = Arrays.copyOfRange(tempArray, (tempArray.length/2));
    return outputArray;
  } 
}

2 个答案:

答案 0 :(得分:2)

您的实施问题在于您使用tempArray的方式:

int[] tempArray = array;

这会将tempArray“别名”归原array,因此对tempArray的任何修改也会发生在原始数组中。这意味着tempArray的{​​{1}}不会在不同的运行中发生变化,因此在第一个之后的任何折叠都将无效。

您需要在外循环的每次迭代中为length创建初始⌈n/2⌉元素的副本。要向上舍入半个长度,请使用以下表达式:

tempArray

这将处理奇数长度的数组。

在每个外部循环迭代结束时,将int halfLength = (tempArray.length+1)/2; int[] tempArray = Arrays.copyOfRange(tempArray, halfLength); 替换为array

答案 1 :(得分:1)

您也可以递归地解决问题:

public static int[] foldArray(int[] array, int runs) {

    if (runs == 0) {
        return array;
    }

    int[] tmp;
    if (array.length % 2 == 0) {
        tmp = new int[array.length / 2];
        for (int i = 0; i < array.length / 2; i++) {
            tmp[i] = array[i];
        }
    } else {
        tmp = new int[array.length / 2 + 1];
        for (int i = 0; i < array.length / 2 + 1; i++) {
            tmp[i] = array[i];
        }
    }

    for (int i = 0; i < array.length / 2; i++) {
        tmp[i] += array[array.length - i - 1];
    }
    return foldArray(tmp, runs - 1);

}

public static void main(String[] args) {
    System.out.println(Arrays.toString(foldArray(new int[]{1, 2, 3, 4, 5}, 1)));
    System.out.println(Arrays.toString(foldArray(new int[]{5, 6, 7, 8}, 1)));
    System.out.println(Arrays.toString(foldArray(new int[]{5, 6, 7, 8}, 2)));
}

请注意,您需要注意输入数组的长度 - 无论是奇数还是偶数。