0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 49
1

Наибольшее число N в массиве, встречающееся столько же N раз

06.02.2018, 19:26. Показов 824. Ответов 7
Метки нет (Все метки)

Дан массив чисел. Нужно написать функцию , которая ищет наибольшее N число в массиве, встречающееся столько же N раз, каков и размер числа, т.е.:

arr (1,2,3,4,1,2,3,4) >>>> 2
arr (4,4,4,4) >>>> 4
arr (1,1,2) >>>> 0

Если массив не отвечает этим условиям, то функция возвращает -1.

Задумал сделать вложенный цикл, так, чтобы первый цикл брал первое значение массива, а второй пробегал по остатку и прибавлял счетчик, но дальше этого дело у меня не идет..

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Arrays {
  
  public static int NmalN(int[] arr) {
    
    int zahl = 0;
    int counter = 0;
    int max=0;
    
    for (int i=0; i<arr.length; i++) {
      for (int j=0; j<arr.length; j++) {
        if (arr[i] == arr [j]) {
          counter++;
          zahl = arr[i];
        }
        
 
      }
 
    }
 
return -1;
 
 
  }
 
  public static void main(String[] args) {
    int [] arr = {2,2,3,3,3,4};
    NmalN(arr);
    
 
  }
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2018, 19:26
Ответы с готовыми решениями:

Найти число, встречающееся в массиве наибольшее число раз
На входе массив из двадцати элементов с целыми числами в диапазоне . Нужно найти число,...

Распечатайте наименьшее число столько раз, сколько наибольшее число
Дайте два числа. Распечатайте наименьшее число столько раз, сколько наибольшее число. например: 2 ...

Найти число встречающееся в списке наибольшее количество раз
Напишите программу, которая находит в данном списке A число, которое встречается в списке...

Одномерные массивы. Найти число, встречающееся наибольшее количество раз
Задан массив целых чисел от -100 до 100. Найти число, встречающееся наибольшее количество раз

7
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
06.02.2018, 19:56 2
Цитата Сообщение от Silury Посмотреть сообщение
Задумал сделать вложенный цикл, так, чтобы первый цикл брал первое значение массива, а второй пробегал по остатку и прибавлял счетчик
Неэффективно. Лучше предварительно отсортировать массив и потом за один проход найти нужное число:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
    int[] nums = new Random().ints(20, 0, 20).toArray();
    System.out.println("Source array:" + Arrays.toString(nums));
    
    Arrays.sort(nums);
    int res = 0, current = 0, count = 1;
    for (int i = 0; i < nums.length;) {
        current = nums[i];
        while (++i < nums.length && nums[i] == current) {
            count++;
        }
        if (current == count) {
            res = current;
        }
        count = 1;
    }
 
    System.out.println(res);
}
0
Эксперт Java
3636 / 2968 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
06.02.2018, 21:57 3
можно так
Java
1
2
3
4
5
6
Arrays.stream(arr).parallel().boxed()
                .collect(groupingBy(identity(), counting()))
                .entrySet().stream()
                .filter(entry -> entry.getKey().longValue() == entry.getValue())
                .map(Map.Entry::getKey)
                .max(comparingInt(i -> i));
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 49
06.02.2018, 22:44  [ТС] 4
Спасибо уважаемые гуру, но больно Ваши коды для меня трудночитаемы, мой велосипед деревянный

нельзя ли код упростить? Да, и эффективность не учитывается, хотя я с вами согласен, alias.
0
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
06.02.2018, 23:11 5
del, не учёл условие с -1.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 49
06.02.2018, 23:19  [ТС] 6
Вот это понятно, спасибо! Alias, если не секрет, сколько времени вам понадобилось?
По идее я должен был решить это задание минут за 15-20, но..
0
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
06.02.2018, 23:39 7
Цитата Сообщение от Silury Посмотреть сообщение
Вот это понятно, спасибо! Alias, если не секрет, сколько времени вам понадобилось?
По идее я должен был решить это задание минут за 15-20, но..
Вот ваш вариант с учётом -1:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static int NmalN(int[] arr) {
 
    int zahl = 0;
    int counter = 0;
    int max = 0;
 
    for (int i=0; i<arr.length; i++) {
        for (int j=0; j<arr.length; j++) {
            if (arr[i] == arr[j]) {
                counter++;
                zahl = arr[i];
            }
        }
        if (zahl == counter && zahl > max) {
            max = zahl;
        }
        if (zahl == 0 && max == 0) {
            max = -1;
        }
        counter = 0;
 
    }
 
    return max;
}
И два других варианта:
Кликните здесь для просмотра всего текста
Мой исправленный вариант:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static int getNum(int[] nums) {
    nums = Arrays.copyOf(nums, nums.length);
    Arrays.sort(nums);
    int res = 0, current = 0, count = 1;
    for (int i = 0; i < nums.length;) {
        current = nums[i];
        while (++i < nums.length && nums[i] == current) {
            count++;
        }
        if (current == count) {
            res = current;
        }
        if (current == 0) {
            res = -1;
        }
        count = 1;
    }
    return res;
}
И в довесок ещё один вариант, похожий на решение xoraxax, только без stream'ов:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static int getNumWithMap(int[] nums) {
        Map<Integer, Integer> occurs = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            occurs.put(nums[i], occurs.getOrDefault(nums[i], 0)+1);
        }
        occurs.put(0, occurs.getOrDefault(0, 0));
        int max = -1;
        for (Map.Entry<Integer, Integer> entry : occurs.entrySet()) {
            if (entry.getKey() == entry.getValue() && entry.getKey() > max) {
                max = entry.getKey();
            }
        }
        return max;
    }

Ничего более умного, чем просто проверить на ноль, не нашёл.
1
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 49
07.02.2018, 00:06  [ТС] 8
А можно же вот так?:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  public static int NmalN(int [] arr) {
 
      
      int zahl = 0;
      int counter = 0;
      int max = -1;
   
      for (int i=0; i<arr.length; i++) {
          for (int j=0; j<arr.length; j++) {
              if (arr[i] == arr [j]) {
                  counter++;
                  zahl = arr[i];
              }
          }
          
          
          if (zahl == counter && zahl > max) {
              max = zahl;
          }
          counter = 0;
   
      }
      if (max == 0) return -1;
   
      return max; 
  }

И работает...

Добавлено через 1 минуту
Строка 23

Добавлено через 1 минуту
А, ну да, вы это уже сделали, не сразу заметил.
Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2018, 00:06
Помогаю со студенческими работами здесь

Определить число, встречающееся в последовательности наибольшее количество раз (массивы)
Определить,какое число в последовательности встречается наибольшее кол-во раз. Если таких элементов...

В массиве найти число, встречающееся наименьшее количество раз
Составьте программу, отыскивающую в одномерном массиве A(N) число, встречающееся наименьшее...

Отыскать в массиве число, встречающееся наименьшее количество раз
составьте программу,отыскивающую в одномерном массиве A(N) число, встречающееся наименьшее...

Отыскать в одномерном массиве число, встречающееся наименьшее количество раз
1. Составьте программу, отыскивающую в одномерном массиве A(N) число, встречающееся наименьшее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru