我已经搜索并考虑了很多,但无法提出解决方案。
给定一个数字数组,我应该将每个元素与下一个元素相加并在同一个数组中写入,然后一次又一次地写入,直到数组的第一个位置[0]包含所有元素的总和。
例如:test[] = {1, 2, 3, 4, 5}
下一步将是:
test[0] = test[0] + test[1] = 1 + 2 = 3;
test[1] = test[2] + test[3] = 3 + 4 = 7;
test[2] = test[4] = 5;
数组变为:{ 3 , 7 , 5 ,4,5}
test[0] = test[0] + test[1] = 3 + 7 = 10;
test[1] = test[3] = 5;
test[0] = test[0] + test[1] = 10 + 5 = 15;
我知道List是正确的解决方案,但练习是用一个简单的数组解决它。 欢迎提出所有建议!
再说一遍:这个任务不是关于效率,而是关于使用数组来解决它。 对不起,这是我的第一篇帖子,看起来很乱。
修改
我所得到的是这样的:
for (int i = 0; i < test.length - (test.length / 2); i++) {
test[i] = test[2 * i] + test[2 * i + 1];
}
但它只能在偶数个给定数字的情况下工作,并且需要在一个循环中重复正确的重复次数。
答案 0 :(得分:0)
这很麻烦,但有效。它修改了数组,每次都覆盖数组的一半(总结),奇数量保持在原位。
int[] test = { 1, 2, 3, 4, 5, 6 };
int l = test.length;
do {
l = sumTo(test, l);
} while (l > 1);
System.out.println(Arrays.toString(test));
sumTo接受两个参数,即要修改的数组,以及要求和的索引。
int sumTo(int[] ar, int to) {
int i;
for (i = 0; i < to; i += 2) {
if (i == to - 1)
ar[i / 2] = ar[i];
else
ar[i / 2] = ar[i] + ar[i + 1];
}
return (i + 1) / 2;
}
答案 1 :(得分:0)
试试这个:
double f = test.length;
for(int j =0; j<=(int)(Math.log(f)/Math.log(2));j++){ //here i want the exponent
int q = (int)Math.ceil(f/Math.pow(2,j)); //simplified because it's calculated once
for (int i = 0; i<q; i+=2){
if(i<q-1){
test[i] += test[i+1];
test[i/2] = test[i];
else{
test[i/2] = test[i];
}
}
}
答案 2 :(得分:0)
public static void main(String[] args) {
int[] tab = new int[]{1,2,3,4};
tab[0] += tab[1];
tab[1] = tab[2]+tab[3];
}
这可能与您的描述相符。