我正在尝试完成一个 smoosh() 方法,它需要一个整数数组。完成后,数组仍应包含相同的数字,但只要数组有两个或多个连续的重复数字,它们就会被该数字的一个副本替换。因此,在 smoosh() 完成后,数组中没有两个连续的数字是相同的。
数组末尾的任何未使用元素都设置为 -1。
例如,如果输入数组是
[ 1 1 0 0 4 4 5 0 0 0 7 ]
它读到
[ 1 0 4 5 0 7 ]
smoosh() 完成后。
方法签名是: public static void smoosh(int[] ints)
我能够这样做:
for (int i=0; i<ints.length-1; i++) {
if (ints[i+1]==ints[i])
ints[i]=-1;
}
for (int i=0; i<ints.length-1; i++) {
if (ints[i]==-1) {
for (int j=i+1; j<ints.length; j++) {
if (ints[j]!=-1) {
//swap ints[j] and ints[i] and then break;
}
}
}
}
但是,这将是 O(n2) 时间(尽管几乎就位)。
我觉得应该有一些 O(n) 就地方法来做到这一点,但我不知道怎么做。谁能想到任何 O(n) 就地算法?(显然,如果您制作另一个相同大小的数组来帮助处理,那么您可以轻松获得 O(n) ,但这不是我想要的,因为那还没有到位......)
谢谢!