从整数数组中删除N个重复项

时间:2017-04-08 21:31:18

标签: java arrays

问题陈述:我必须从数组中删除n个重复项。

以下是完整的问题陈述:https://pastebin.com/EJgKUGe3

我的解决方案是:

public class minion_labour_shift_2ndTry {
    static int[] data = {1,2, 2, 3, 3, 3, 4, 5, 5};   

    public static void main(String[] args) {

        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();

        data = answer(data, n);
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + " ");
        }

    }

    public static int[] answer(int[] data, int n) {
        if (data.length>99){
            System.exit(0);
        }
        int[] result = new int[99];
        ArrayList<Integer> temp = new ArrayList<>();
        int counter = 0, count ,maxCount = 0;

        for (int i = 0; i < data.length; i++) {
            boolean isDistinct = false;
            for (int j = 0; j < i; j++) {
                if (data[i] == data[j]) {
                    isDistinct = true;
                    break;
                }
            }
            if (!isDistinct) {
                result[counter++] = data[i];
            }
        }
        for (int i = 0; i < counter; i++) {
            count = 0;
            for (int j = 0; j < data.length; j++) {
                if (result[i] == data[j]) {
                    count++;
                }
            }
            System.out.println("....... count"+count);
            if (maxCount <= count){
                maxCount = count;
            }

            if (count <= n){
                temp.add(result[i]);
            }
        }

        if (maxCount-1 < n){
            return data;
        }

        data = new int[temp.size()];
        for (int i = 0; i <temp.size() ; i++) {
            data[i] = temp.get(i);
        }
        return data;
    }
}

现在,我的问题是,我错过了什么以及如何通过所有10个案例。

在此先感谢:)

注意:它将在java 7中编译,并且不允许使用Map,hashset或第三方库,输入/输出操作,产生线程或进程以及对执行环境的更改。

2 个答案:

答案 0 :(得分:0)

不打算提供完整的解决方案,但建议重新编写算法,因为不清楚你在做什么,你从未解释过你对算法的实际想法。例如,您使用的是什么isDistinct?

1)循环一次并计算每个数字的频率。您可以使用长度为100的数组,因为这将是所有数据输入。当你循环时,跟踪两件事:出现超过n次的条目总数,以及这些数字

2)创建一个适当大小的结果数组(从上面计算)并再次遍历列表并填写未超过阈值的元素。

答案 1 :(得分:0)

我最初误解了这些要求,这就是所要求的:

  public static int[] answer2(int[] data, int n) {
    if (data.length>99){
        System.exit(0);
    }
    ArrayList<Integer> temp = new ArrayList<>();
    int count;

    for (int i = 0; i < data.length; i++) {
        count = 0;
        for (int j = 0; j < data.length; j++) {
            if (data[i] == data[j]) {
                count++;
            }
        }

        if (count <= n){
            temp.add(data[i]);
        }
    }


    data = new int[temp.size()];
    for (int i = 0; i <temp.size() ; i++) {
        data[i] = temp.get(i);
    }
    return data;
  }

...还有你自己的代码,略有改动:

{{1}}