Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 22.03.2020
Сообщений: 13

Дана последовательность из N чисел. Посчитайте, сколько в ней пар элементов, равных друг другу

22.03.2020, 13:05. Показов 5991. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие задачи:

Дана последовательность из N чисел. Посчитайте, сколько в ней пар элементов, равных друг другу. Считается, что любые два элемента, равные друг другу образуют одну пару, которую необходимо посчитать.

Входные данные:
Сначала вводится N – количество элементов, а затем сами элементы

Выходные данные:
Количество пар элементов, равных друг другу

Примеры:
Входные данные:
1 2 2 3 3 3
Выходные данные:
4

Входные данные:
1 1 1 1 1
Выходные данные:
10

Важно! Строки, списки и другие аналогичные типы данных использовать нельзя.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2020, 13:05
Ответы с готовыми решениями:

Дан список чисел: посчитайте, сколько в нем пар элементов, равных друг другу
Дан список чисел. Посчитайте, сколько в нем пар элементов, равных друг другу. Считается, что любые два элемента, равные друг другу образуют...

Дан список чисел: посчитайте, сколько в нем пар элементов, равных друг другу
Дан список чисел. Посчитайте, сколько в нем пар элементов, равных друг другу. Считается, что любые два элемента, равные друг другу образуют...

Дан список целых чисел. Программа должна вывести число пар элементов, равных друг другу
Дан список целых чисел. Программа должна вывести число пар элементов, равных друг другу. Считается, что любые два элемента, равные друг...

30
0 / 0 / 0
Регистрация: 22.03.2020
Сообщений: 13
22.03.2020, 19:19  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Catstail Посмотреть сообщение
- или список однозначных чисел...
Ни то, ни другое
Цитата Сообщение от Catstail Посмотреть сообщение
Кстати, это уже не первая задача с паскудно-неопределенным условием.
Да, так и есть, к сожалению
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.03.2020, 19:19
Цитата Сообщение от Roman Hoffmann Посмотреть сообщение
ни на каком-либо другом этапе задачи не могу поместить их в список
Помести их в словарь. Получишь счетчик для каждого введенного числа.
Затем пробегись по ключам и подсчитай пары.
0
0 / 0 / 0
Регистрация: 22.03.2020
Сообщений: 13
22.03.2020, 19:20  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Помести их в словарь
И снова не могу. Вообще объединить никак не могу по условию задачи
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
22.03.2020, 19:33
1) если список отсортированный. то можно решить за O(n) по времени и O(1) по памяти. не сохраняя данные.
2) если не отсортирован. тогда сортировка O(n*logn). и подсчет за O(n) по времени и O(1) по памяти. Но список нужно хранить.
0
0 / 0 / 0
Регистрация: 22.03.2020
Сообщений: 13
22.03.2020, 19:35  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
Но список нужно хранить.
Т. е. без списка никак?
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.03.2020, 19:47
Цитата Сообщение от Roman Hoffmann Посмотреть сообщение
Т. е. без списка никак?
Зачем спрашивать?
Где попытка ввода хоть какого-то кода и ответ тестирующей системы?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
22.03.2020, 19:47
Цитата Сообщение от Roman Hoffmann Посмотреть сообщение
Т. е. без списка никак?
- без какого-либо контейнера, позволяющего хранить все элементы, похоже, не получится...
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.03.2020, 19:48
Цитата Сообщение от Roman Hoffmann Посмотреть сообщение
Т. е. без списка никак?
Ты можешь хранить его в памяти (в голове). Только зачем тогда пытаться решать эту задачу на Python?
Можно и на бумажке.
А на Python, кстати, она решается в одну строку.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
22.03.2020, 19:51
Либо через словарь, не сохраняя список. O(n) по времени и O(n) по памяти.
0
0 / 0 / 0
Регистрация: 22.03.2020
Сообщений: 13
22.03.2020, 19:54  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
А на Python, кстати, она решается в одну строку
Это решение предполагает использование контейнера, в котором хранятся все элементы, что по условию задачи делать нельзя
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.03.2020, 21:58
Лучший ответ Сообщение было отмечено Roman Hoffmann как решение

Решение

Для того чтобы этот топик не остался совсем бесполезным, вот список возможных решений данной задачи.
(подразумевается, наиболее очевидных и используемых на практике.)
Возможно, кто-то дополнит.

Python
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def countpairs(a):
    '''
    Наивный алгоритм полного перебора
    Сложность O(N^2)
    
    In [1]: import random
    
    In [2]: arr = [random.randint(1,10000) for _ in range(10000)]
    
    In [3]: %timeit -n 10 -r 1 countpairs(arr)
    7.86 s ± 0 ns per loop (mean ± std. dev. of 1 run, 10 loops each)
    '''
    
    counter = 0
    for i in range(len(a)):
        for j in range(i + 1, len(a)):
            if a[i] == a[j]:
                counter += 1
    return counter
 
 
def countpairs2(a):
    '''
    Сложность O(N^2)
    Работает чуть быстрее чем перебор в два цикла за счет использования count в
    качестве второго цикла.
    
    In [1]: import random
    
    In [2]: arr = [random.randint(1,10000) for _ in range(10000)]
    
    In [3]: %timeit -n 10 -r 1 countpairs2(arr)
    3.79 s ± 0 ns per loop (mean ± std. dev. of 1 run, 10 loops each)
    '''
    
    return sum(a.count(x) - 1 for x in a) // 2
 
 
def countpairs3(a):
    '''
    Сложность O(N) на создание словаря счетчика + O(N) на подсчет пар
    Сложность по памяти O(N)
    
    In [1]: import random
    
    In [2]: arr = [random.randint(1,10000) for _ in range(10000)]
    
    In [3]: %timeit -n 10 -r 10 countpairs3(arr)
    7.1 ms ± 293 µs per loop (mean ± std. dev. of 10 runs, 10 loops each)
    '''
    
    cnt = {}
    for num in a:
        cnt.setdefault(num,0)
        cnt[num] += 1
    
    return sum(cnt[num] * (cnt[num] - 1)//2  for num in cnt)
 
 
from collections import Counter
 
def countpairs4(a):
    '''
    Сложность O(N) на создание словаря счетчика + O(N) на подсчет пар
    Сложность по памяти O(N)
    
    In [1]: import random
    
    In [2]: arr = [random.randint(1,10000) for _ in range(10000)]
    
    In [3]: %timeit -n 10 -r 10 countpairs4(arr)
    5.59 ms ± 369 µs per loop (mean ± std. dev. of 10 runs, 10 loops each)
    '''
    
    
    cnt = Counter(a)
    return sum(
            cnt[num] * (cnt[num] - 1)//2  for num in cnt
    )
 
 
 
def countpairs5(arr):
    '''
    Сложность O(N log N) на сортировку + O(N) на подсчет пар
    
    In [1]: import random
    
    In [2]: arr = [random.randint(1,10000) for _ in range(10000)]
    
    In [3]: %timeit -n 10 -r 10 countpairs5(arr)
    9.21 ms ± 351 µs per loop (mean ± std. dev. of 10 runs, 10 loops each)
    '''
    
    arr = sorted(arr)
    len_a = len(arr)
    pairs, curr = 0, 0
    cnt = 0
    
    while curr < len_a - 1:
        cnt = 1
        next_ = curr + 1
        # сравниваем последующие числа с текущим
        while next_ < len(arr):
            # пока числа равны - ведем подсчет
            if arr[next_] == arr[curr]:
                cnt += 1
                next_ +=1
            # иначе - другое число - прерываемся
            else:
                break
        
        #  инкрементируем общий счетчик пар
        # по формуле возможных пар для этого числа
        pairs += cnt * (cnt - 1)//2 
        # начинаем с первого a[next_] неравного текущему a[curr]
        curr = next_
    return pairs
По оценкам видно, что наиболее разумный по производительности - последний.
Но countpairs3 и countpairs4 наиболее просты в реализации, очень быстры, однако требуют доп. памяти под хранение счетчиков.
Два же первых - имеют квадратичную сложность, поэтому подходят только для небольших списков.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2020, 21:58

Количество пар элементов равных друг другу в массиве
Посчитайте количество пар элементов равных друг другу в массиве. Любые два элемента равные друг другу образуют пару. Требования: На вход...

Подсчет количества пар элементов, равных друг другу, в массиве
Дан массив чисел. Посчитайте, сколько в нем пар элементов, равных друг другу. Считается, что любые два элемента, равные друг другу образуют...

Дана последовательность из M чисел. Подсчитать сколько в ней отрицательных, положительных и нулевых элементов
Дана последовательность из M чисел. Подсчитать сколько в ней отрицательных, положительных и нулевых элементов сделать в Microsoft Visual...

Дана последовательность из М чисел. Подсчитать, сколько в ней отрицательных, положительных и нулевых элементов
Помогите нужна блок схема и нужно написать код

Дана последовательность из М чисел. Подсчитать, сколько в ней отрицательных, положительных и нулевых элементов
Дана последовательность из М чисел. Подсчитать, сколько в ней отрицательных, положительных и нулевых элементов. Добавлено через 41...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru