我正在寻找如何解决这个问题或我出错的地方。
问题如下:编写一个名为stretch的静态方法,它接受一个整数数组作为参数,并返回一个两倍于原始数组的新数组,用一对整数替换原始数组中的每个整数,每个整数原来的一半。如果原始数组中的数字是奇数,则新对中的第一个数字应该比第二个数字高一个,以使总和等于原始数字。例如,如果名为list的变量引用存储值{18,7,4,24,11}的数组,则调用stretch(list)应该返回一个包含{9,9,4,3,2的新数组,2,12,12,6,5}。 (数字18被拉伸成对9,9,数字7被拉伸为4,3,数字4被拉伸为2,2,数字24被拉伸为12,12,数字11被拉伸为6 ,5。) 使用以下类测试代码: import java.util。*;
public class TestStretch {
public static void main(String[] args) {
int[] list = {18, 7, 4, 14, 11};
int[] list2 = stretch(list);
System.out.println(Arrays.toString(list)); // [18, 7, 4, 24, 11]
System.out.println(Arrays.toString(list2)); // [9, 9, 4, 3, 2, 2, 7, 7, 6, 5]
}
// your code goes here
}
这是我现在所拥有的,但是它工作不正常...我感觉这是我如何使用int i和int j,但我不确定该怎么做修复它以使其按预期工作。
import java.util.*;
public class TestStretch {
public static void main(String[] args) {
int[] list = {18, 7, 4, 14, 11};
int[] list2 = stretch(list);
System.out.println(Arrays.toString(list)); // [18, 7, 4, 24, 11]
System.out.println(Arrays.toString(list2)); // [9, 9, 4, 3, 2, 2, 7, 7, 6, 5]
}
public static int[] stretch(int[] array){
int length = array.length;
int[] newArray = new int[array.length*2];
for(int i = 0; i< length; i=i+2){
int j = 0;
if(array[i] % 2 == 0){
newArray[i] = (array[j]/2);
newArray[i+1] = newArray[i];
j++;
} else{
newArray[i] = (array[j]/2);
newArray[i+1] = (newArray[i] + 1);
j++;
}
}
return newArray;
}
}
我得到的输出是:
[18, 7, 4, 14, 11]
[9, 9, 9, 9, 9, 10, 0, 0, 0, 0]
而不是:
[18, 7, 4, 24, 11]
[9, 9, 4, 3, 2, 2, 7, 7, 6, 5]
答案 0 :(得分:1)
有几个错误:
j
的值在每次迭代中重置为0 此外,该算法可以简化:
i
,您希望在目标位置2 * i
和2 * i + 1
设置。纠正上述问题,并简化实施:
int[] newArray = new int[array.length * 2];
for (int i = 0; i < array.length; i++) {
newArray[2 * i] = array[i] / 2 + array[i] % 2;
newArray[2 * i + 1] = array[i] / 2;
}
return newArray;
答案 1 :(得分:0)
三个错误:
j
应该在for-loop j
将新值记录到新数组我们应该在2中的每次迭代时增加j
- 我们应该将i
仅增加1(因为我们使用j
来插入两个项目我们使用i
来迭代原始数组:
int j = 0;
for(int i = 0; i< length; i++){
if(array[i] % 2 == 0){
newArray[j] = newArray[j+1] = array[i]/2;
} else{
newArray[j] = array[i]/2 + 1;
newArray[j+1] = array[i]/2;
}
j += 2;
}
注意:给一个包含数组的变量名称&#34; list&#34;可能会造成混乱!
答案 2 :(得分:0)
for(int i = 0; i< length; i=i+2){
length
是原始数组的长度,因此您只迭代超过一半的值,因为每步增加i
{。}}。
2
这应该是
if(array[i] % 2 == 0){
因为你在for循环中定义if(array[j] % 2 == 0){
,所以array [j]总是返回j
。哦,你将元组的第二个元素设置为较高元素,而代码中的注释则表示相反应该发生。
因此,您的方法的固定版本将如下所示:
18
避免重复代码:
public static int[] stretch(int[] array){
int length = array.length;
int[] newArray = new int[array.length*2];
int j = 0;
for(int i = 0; i< newArray.length; i=i+2){
if(array[j] % 2 == 0){
newArray[i] = (array[j]/2);
newArray[i+1] = newArray[i];
} else{
newArray[i+1] = (array[j]/2);
newArray[i] = (newArray[i+1] + 1);
}
j++;
}
return newArray;
}
或者使用花哨的流:
public static int[] stretch(int[] array){
int[] newArray = new int[array.length*2];
int j = 0;
for(int i = 0; i< newArray.length; i=i+2){
int val = array[j];
newArray[i] = (val/2);
newArray[i+1] = newArray[i];
if(val % 2 != 0){
newArray[i]++;
}
j++;
}
return newArray;
}
答案 3 :(得分:0)
首先,如果循环到旧数组的长度,请不要将i
增加2。
如果i
每次增加1,我们需要弄清楚如何将旧数组的索引i
映射到新数组的索引。这很简单:新数组的索引只是i*2
和i*2+1
。
现在j
似乎是多余的,因为它始终与i
保持相同的值,因此您可以将其删除。
这是完整的代码:
int length = array.length;
int[] newArray = new int[array.length*2];
for(int i = 0; i< length; i++){
if(array[i] % 2 == 0){
newArray[i*2] = (array[i]/2);
newArray[i*2+1] = newArray[i*2];
} else{
newArray[i*2] = (array[i]/2);
newArray[i*2+1] = (newArray[i*2] + 1);
}
}
return newArray;