1 Востаннє редагувалося koala (14.08.2021 05:59:21)

Тема: Створити новий список - не виходить змінити довжину

Враховуючи список lst та число N, створіть новий список, який містить кожне число lst щонайбільше N разів без впорядкування. Наприклад, якщо N = 2, а вхід [1,2,3,1,2,1,2,3], ви берете [1,2,3,1,2], скидаєте наступний [1,2 ] оскільки це призведе до того, що 1 і 2 будуть в результаті 3 рази, а потім приймуть 3, що призводить до [1,2,3,1,2,3].

Приклади.

EnoughIsEnough.deleteNth(new int[] {20,37,20,21}, 1) // return [20,37,21]
EnoughIsEnough.deleteNth(new int[] {1,1,3,3,7,2,2,2,2}, 3) // return [1, 1, 3, 3, 7, 2, 2, 2]

Код.

public static int[] deleteNth(int[] elements, int maxOccurrences) {
       int  count;
       int str = 0;
       for (int a=0; a<elements.length; a++) {
           count = 0;
           for (int j =0; j<str; j++) {
               if (elements[a]==elements[j]) count++;
           }
           if (count<maxOccurrences) {
               elements[str] = elements[a];
               str++;
           }
       }
       elements.length = str;

       return elements;
    }

Вибиває помилка: Не вдається присвоїти значення кінцевій змінній "length".

2 Востаннє редагувалося koala (14.08.2021 06:02:55)

Re: Створити новий список - не виходить змінити довжину

1. У Java масив має незмінну кількість елементів. Треба або використовувати інший тип (List, ArrayList), або створювати новий масив - скажімо, функцією Arrays.copyOf.

       return Arrays.copyOf(elements, str);

2. Якщо масив великий, то можна оптимізувати алгоритм, створивши додаткову структуру для підрахунку елементів (HashMap, наприклад).
Принагідно:

3. У майбутньому використовуйте теги code (кнопка <>) самостійно. Я додав.
4. Давайте темам зрозумілі назви (в ідеалі - що робите - опис проблеми). Я поки перейменую як сам бачу.
5. Не розміщуйте два вирази в одному рядку коду, це погіршує читаність:

           for (int j =0; j<str; j++) {
               if (elements[a]==elements[j]) 
                   count++;
           }

До речі,

               elements[str] = elements[a];
               str++;

теж можна скоротити - і правильно ви зробили, що не скоротили.

               elements[str++] = elements[a];

6. Давайте змінним зрозумілі назви. count - добре. j - стерпно, до змінних i та j всі звикли, хоча дехто і не рекомендує (замість i можна писати index чи хоча б idx). a, str - що це таке?
7. Користуйтеся можливостями сучасної Java, зокрема, циклом по елементах:

for(int number: elements)
{
  /*тут можна замість elements[a] використовувати number*/
}

8. Змінювати вхідні аргументи загалом погано.

Подякували: 0xDADA11C7, Hunach2