我正在研究一种方法,该方法将采用整数数组并将其折叠半个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;
}
}
答案 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)));
}
请注意,您需要注意输入数组的长度 - 无论是奇数还是偶数。