3 回答
TA贡献1804条经验 获得超3个赞
我观察到的代码有两个问题。
1) 您的交换器逻辑在与您之前进行修改的阵列不同的阵列上执行交换
2)您需要以冒泡排序的方式拥有此逻辑,即在循环内循环
以下是您的方法的有效修改示例代码。我只修改了第二个 for 循环逻辑
public void implode(int[] ary) {
int swapper = -1;
int[] newARY = new int[ary.length];
int current = -1;
for (int i = 0; i < ary.length; i++) {
if (current != ary[i]) {
newARY[i] = ary[i];
current = ary[i];
}
}
for (int i = 0; i < newARY.length - 1; i++) {
if (newARY[i] == 0 && newARY[i + 1] != 0) {
for (int j = i; (j + 1) < newARY.length; j++) {
swapper = newARY[j + 1];
newARY[j] = swapper;
newARY[j + 1] = 0;
}
}
}
for (int i = 0; i < newARY.length; i++) {
System.out.print(newARY[i] + " ");
}
}
TA贡献1775条经验 获得超11个赞
不是您问题的答案,但使用(如果可能)Java 流可以缩短您的方式:
int[] arr = {1,3,3,4,4,5,6,6,7};
// distinct
List<Integer> list = Arrays.stream(arr).distinct().boxed().collect(Collectors.toList());
// pad with zero's
while(list.size() < arr.length) {
list.add(0);
}
// display
System.out.println(list.stream().map(String::valueOf).collect(Collectors.joining(",")));
会输出
1,3,4,5,6,7,0,0,0
TA贡献1951条经验 获得超3个赞
在第一个循环中:
for (int i = 0; i < ary.length; i++) {
if (current != ary[i]) {
newARY[i] = ary[i];
current = ary[i];
}
}
你用重复的值填充newARY元素ary变成0:
newARY: 1 0 2 3 4 0 5 6
但是,在第二个循环中:
for (int i = 0; i < ary.length; i++)
{
if (ary[i] == 0)
{
if (ary[i + 1] != 0)
{
swapper = ary[i + 1];
ary[i] = swapper;
ary[i + 1] = 0;
}
}
}
您正在修改原始ary数组。所以 newARY 没有更新。
但是,如果连续有两个以上的 0,您将 0 推到数组末尾的尝试也会失败。而且它也容易受到 ArrayOutOfBoundIndexException 的影响,因为您尝试ary[i+1]不受限制地阅读i
将 0 推到数组末尾的一种简单而直接的方法是创建具有非 0 元素的新数组,然后再填充 0:
int[] result = new int[ary.lenght];
int resultIndex = 0;
for (int i = 0; i < newARY.length; i++) {
if (newARY[i] != 0) {
result[resultIndex++] = newAry[i];
}
}
for (int i = resultIndex; i < newARY.length; i++) {
result[i] = 0;
}
// Print result array
提示:使用上述策略,您可以简化您的代码。无需创建直接数组 newARY。只需循环遍历原始数组,将唯一元素推送到结果数组,然后用 0 填充剩余的任何插槽。
添加回答
举报