我正在尝试编写一个接受排序数组和整数的方法,并返回一个新的排序数组,其中整数位于正确的位置。
我试图在不使用动态数组的情况下执行此操作,以及仅使用1 for循环 - 我使用不同的方法。
这是方法:
public static int[] insert(int[] a, int k) {
int j = 0;
int[] s = new int[a.length + 1];
for(int i = 0; i < a.length; i++) {
if(k < a[i] && j == 0) {
s[i] = k;
j++;
} else {
s[i + j] = a[i];
}
}
return s;
}
我的测试输入是
int[] array1 = new int[]{1, 2, 3, 4, 6, 7, 8};
我试图插入5。
我对这个特殊方法的问题是,它总是会在插入的整数后设置索引为0.在这种情况下,它会存储和打印
1, 2, 3, 4, 5, 0, 7, 8
而不是
1, 2, 3, 4, 5, 6, 7, 8
由于
答案 0 :(得分:2)
它没有将索引设置为零,它只是跳过一个索引。当k < a[i]
为真时,它会递增i
(在for循环中)和j
(在j++
语句中)。因此,当您下次执行s[i + j] = a[i]
时,它将跳过两个位置而不是一个位置。
解决方案是确保在循环的每次迭代中都复制原始数组的值。换句话说,一旦您将k
分配给s[i]
,您就需要将a[i]
分配给s[i + 1]
。实现此目的的最简单方法是删除else
子句并在每次迭代时执行s[i + j]
。
答案 1 :(得分:0)
您可能想要使用替代方案。而不是使用循环,使用Arrays对象来添加和排序数组。
示例:
public int[] insert(int[] a, int k) {
// create a copy of int array parameter and add one to the length
int[] s = Arrays.copyOf(a, a.length + 1);
// add the second parameter at the end of the new array
s[s.length - 1] = k;
// sort the array
Arrays.sort(s);
return s;
}
答案 2 :(得分:0)
public static int[] insertIntoSortedArray(int[] array, int k) {
int[] newArray = new int[array.length + 1];
int i = 0;// for array
int j = 0;// for new array
boolean inserted = false;
while (i < array.length) {
if (!inserted && k < array[i]) {
newArray[j] = k;
inserted = true;
} else {
newArray[j] = array[i++];
}
j++;
}
return newArray;
}