Задача Google Foobar: задание Minion Work Assignment Тестовые случаи Java не проходят

Я попытался решить эту проблему с помощью Java, и по какой-то причине только 2 из 9 тестовых случаев проходят, но локально все мои тестовые примеры проходят. Я на 99% уверен, что с тестовыми примерами Google Foobar Java для этой задачи существует некоторая проблема. Кто-нибудь сталкивался с этим, и если да, что вы сделали, чтобы решить эту проблему?

Вопрос был ...

      Write a function called solution(data, n) that takes in a list of 
less than 100 integers and a number n, and returns that same list 
but with all of the numbers that occur more than n times removed 
entirely. 

The returned list should retain the same ordering as the original 
list - you don't want to mix up those carefully-planned shift 
rotations! For instance, if data was [5, 10, 15, 10, 7] and n was 1,
solution(data, n) would return the list [5, 15, 7] because 10 occurs 
twice, and thus was removed from the list entirely.

-- Java cases --
Input:
Solution.solution({1, 2, 3}, 0)
Output:
    

Input:
Solution.solution({1, 2, 2, 3, 3, 3, 4, 5, 5}, 1)
Output:
    1,4

There are 6 more test cases that are hidden.

Ниже представлено решение, которое я создал.

      public class MinionShift {
    public static int[] solution(int[] data, int n) {
        if(n<1)
            return new int[0];

        if(data.length < 1)
            return data;

        Map<Integer, Integer> map = new HashMap<>();

        for(int d: data) {
                map.put(d, map.getOrDefault(d, 0) + 1);
        }

        return Arrays.stream(data).filter(c->map.containsKey(c) && !(map.get(c)>n)).toArray();
    }
}

Тестовые примеры, которые я пробовал ...

      [{1, 2, 3}, 0]
[{1, 2, 2, 3, 3, 3, 4, 5, 5}, 1]
[{1, 2, 2, 3, 3, 3, 4, 5, 5}, 10]
[{1, 2, 2, 3, 3, 3, 4, 5, 5}, -1]
[{}, 5]
[{1, 1, 1, 1, 1}, 5]
[{101, 102, 103, 104, 105}, 5]

Изменить ... Я попробовал решение на основе потока Java, как показано ниже, но, к сожалению, проблема исчезла, когда я представил решение Python. Но я все равно размещаю это здесь.

      public class MinionShift {
    public static int[] solution(int[] data, int n) {
        if(n<1)
            return new int[0];

        if(data.length < 1)
            return data;

        return Arrays.stream(data).filter(d->Arrays.stream(data).filter(i->i==d).count()<=n).toArray();
    }
}

1 ответ

Вот как я заставил это работать, вы должны работать с массивом в обратном направлении. Вам нужно создать еще один массив, чтобы проверить наличие дубликатов, чтобы запомнить их.

      public static int[] solution(int[] data, int n){
    if(n < 1){
        return new int[0];
    }

    if(data.length < 1){
        return data;
    }

    List<Integer> a = Arrays.stream(data).boxed().collect(Collectors.toList());

    for(int i = a.size()-1; i > -1; i--){
        ArrayList<Integer> t = new ArrayList<>();

        for(int j = 0; j < a.size(); j++){
            if(a.get(j) == a.get(i)){
                t.add(j);
            }
        }


        if(t.size() > n){
            for(int j = t.size()-1; j > -1; j--){
                a.remove((int) t.get(j));
            }

            i -= t.size()-1;
        }
    }

    data = new int[a.size()];
    int c = 0;
    for(int d : a){
        data[c] = d;
        c++;
    }

    return data;
}
Другие вопросы по тегам