在 algoexpert 中解决一些问题并获得奇怪的索引超出范围异常:
问题只是取一个数组和另一个 int 并将所有等于这个 int 的数字放在数组的末尾,如下所示:
数组:[2, 1, 2, 2, 2, 3, 4, 2] 整数 toMove: 2
输出:[1,3,4,2,2,2,2,2]
所以我写了这个算法:
class Program {
public static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
// Write your code here.
int newArr[] = new int[array.size()];
int lastIndertedNotToMoveIdx = 0;
int endOfArrayIdx = array.size();
// ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i <= array.size(); i++) {
if (array.get(i) == toMove) {
newArr[endOfArrayIdx] = array.get(i);
endOfArrayIdx = endOfArrayIdx-1;
} else {
newArr[lastIndertedNotToMoveIdx] = array.get(i);
lastIndertedNotToMoveIdx++;
}
}
List<Integer> ret_list = new ArrayList<Integer>();
for(Integer num:newArr) {
ret_list.add(num);
}
return ret_list;
}
}
但在这里newArr[endOfArrayIdx] = array.get(i);
我收到这条消息:
java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
at Program.moveElementToEnd(Program.java:12)
at AeJsonTest.getActual(AeJsonTest.java:27)
at Main.main(Main.java:57)
不知道为什么...
答案 0 :(得分:1)
endOfArrayIdx
应该从 array.size() - 1
开始,而不是从 array.size()
开始,后者是数组的长度。数组的长度始终是数组的无效索引。
此外,for 循环条件应该是 i < array.size()
,而不是 i <= array.size()
。
答案 1 :(得分:0)
newArr[endOfArrayIdx] = array.get(i);
应该是:
newArr[endOfArrayIdx - 1] = array.get(i);
Java 中的数组从 0 到长度 - 1。
答案 2 :(得分:0)
既然你有清单,那就用吧!这会比你做的要容易得多。并且您“奇怪的 IndexOutOfBoundException”的风险将降低。
static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
for (int i = 0, lastElementIndex = array.size() - 1; i <= lastElementIndex; ) {
if (array.get(i) == toMove) {
array.remove(i);
array.add(toMove);
lastElementIndex--;
} else {
i++;
}
}
return array;
}
另一种方法是根本不触摸输入列表。在这里你甚至没有任何索引!
static List<Integer> moveElementToEnd(List<Integer> array, int toMove) {
List<Integer> head = new ArrayList<>();
int toMoveCount = 0;
for (int value : array) {
if (value == toMove) {
toMoveCount++;
} else {
head.add(value);
}
}
head.addAll(Collections.nCopies(toMoveCount, toMove));
return head;
}