【问题标题】:Java Removing Redundant Items in ArrayJava删除数组中的冗余项
【发布时间】:2018-09-01 03:39:06
【问题描述】:

对于这个特殊问题,我试图删除排序数组中的冗余元素,并在数组的 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

我有什么遗漏吗?

提前致谢。

【问题讨论】:

  • 你真的需要那些零吗?因为它失败了删除数组中冗余元素的任务(有多个零,运行你的implode())。

标签: java arrays loops redundancy


【解决方案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

【讨论】:

    【解决方案2】:

    我观察到的代码有两个问题。

    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] + " ");
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      在第一个循环中:

      for (int i = 0; i < ary.length; i++) {
          if (current != ary[i]) {
              newARY[i] = ary[i];
              current = ary[i];
          }
      }
      

      你用ary中的元素填充newARY,重复值变为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 填充任何剩余的槽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        • 2011-10-22
        • 2018-01-19
        • 1970-01-01
        • 2021-01-22
        • 2013-01-23
        相关资源
        最近更新 更多