代码之家  ›  专栏  ›  技术社区  ›  Granzo

Java删除数组中的冗余项

  •  0
  • Granzo  · 技术社区  · 6 年前

    对于这个特殊的问题,我试图删除排序数组中的冗余元素,并在同一时间将它们全部替换为0

    1,3,3,4,4,5,6,6,7

    我的输出数组应该是

    我第一次尝试解决这个问题是创建一个交换程序,以便在删除元素后将所有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};
    

    然而,当输出内爆数组时,我收到了这个。

    有什么我不知道的吗?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Ashishkumar Singh    6 年前

    我发现你的代码有两个问题。

    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] + " ");
        }
    
    }
    
        2
  •  1
  •   guleryuz    6 年前

    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
    
        3
  •  0
  •   Mạnh Quyết Nguyễn    6 年前

    在第一个循环中:

    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;
                }
    
            }
    
        }
    

    你在修改你的原稿

    但是,如果连续有两个以上的0,则将0推到数组末尾的尝试也会失败。而且它也容易受到ArrayOutOfBoundIndexException的攻击,因为您尝试读取 ary[i+1] 不限制 i

    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填充剩余的任何槽。