对于这个特殊的问题,我尝试删除已排序数组中的多余元素,并在数组的 end 处将它们全部替换为0。例如,如果我有一个由int元素组成的数组
1,3,3,4,4,5,6,6,7
我的输出数组应该是
1,3,4,5,6,7,0,0,0
我对这个问题的第一次尝试是创建一个交换器,以便在删除元素后将所有0推到列表的末尾,但是似乎不会将零推到列表的末尾。这是我的代码。
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 < 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;
for (int i = 0; i < newARY.length; i++)
{
System.out.print(newARY[i] + " ");
}
}
我正在测试的数组是
int[] aryIn2 = {1, 1, 2, 3, 4, 4, 5, 6};
但是,当输出内爆数组时,我收到了这个。
1 0 2 3 4 0 5 6
有什么我想念的吗?
谢谢。
答案 0 :(得分:1)
不是您问题的答案,但是使用(如果可能)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
答案 1 :(得分:0)
在第一个循环中:
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推到数组末尾的一种简单明了的方法是创建具有非0s元素的新数组并在以后填充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。
答案 2 :(得分:0)
我观察到的两个代码问题。
1)您的交换器逻辑正在与先前进行修改的阵列不同的阵列上执行交换
2)您需要以冒泡排序的方式拥有此逻辑,即在一个循环中循环
下面是您的方法的有效修改示例代码。我只修改了第二个for-loop逻辑
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] + " ");
}
}