Как найти количество повторений в массиве

Есть массив: [1, 3, 4, 1, 1, 3, 4, 5].

Числа могут быть различные. Мне нужно посчитать количество повторений каждого числа. То есть, например, для вышеуказанного массива:

число 1 == 3 раза
число 3 == 2 раза
число 4 == 2 раза
число 5 == 1 раз

Regent's user avatar

Regent

19.1k6 золотых знаков29 серебряных знаков44 бронзовых знака

задан 12 июл 2016 в 11:09

amijin's user avatar

2

Можно воспользоваться методом reduce

document.write('<pre>', JSON.stringify(
  [1, 3, 4, 1, 1, 3, 4, 5].reduce((acc, el) => {
    acc[el] = (acc[el] || 0) + 1;
    return acc;
  }, {}), null, 2), '</pre>');

Вариант без стрелочных функций

var result = [1, 3, 4, 1, 1, 3, 4, 5].reduce(function(acc, el) {
  acc[el] = (acc[el] || 0) + 1;
  return acc;
}, {});

document.write('<pre>', JSON.stringify(
  result, null, 2), '</pre>');

ответ дан 12 июл 2016 в 11:15

Grundy's user avatar

GrundyGrundy

79.8k9 золотых знаков76 серебряных знаков133 бронзовых знака

2

Самое простое решение:

var arr = [1, 3, 4, 1, 1, 3, 4, 5];
var result = {};
for (var i = 0; i < arr.length; ++i)
{
    var a = arr[i];
    if (result[a] != undefined)
        ++result[a];
    else
        result[a] = 1;
}
for (var key in result)
    document.write('число ' + key + ' == ' + result[key] + ' раз(а) <br>');

Можно использовать метод forEach для массивов:

var arr = [1, 3, 4, 1, 1, 3, 4, 5];
var result = {};
arr.forEach(function(a){
    if (result[a] != undefined)
        ++result[a];
    else
        result[a] = 1;
});
for (var key in result)
    document.write('число ' + key + ' == ' + result[key] + ' раз(а) <br>');

Применив небольшую хитрость, можно записать ещё короче:

var arr = [1, 3, 4, 1, 1, 3, 4, 5];
var result = {};
arr.forEach(function(a){
    result[a] = result[a] + 1 || 1;
});
for (var key in result)
    document.write('число ' + key + ' == ' + result[key] + ' раз(а) <br>');

ответ дан 12 июл 2016 в 12:07

Эффективный алгоритм: сортируем числа, проходим по массиву, считаем повторения. В отличии от тупого перебора(прошлись по каждому числу и посчитали его количество) который работает за O(N^2) такой алгоритм работает за O(N log N). Хотя автору темы вряд-ли нужен эффективный алгоритм, но кому-то может пригодиться.

ответ дан 8 ноя 2017 в 15:18

moskalenco_a's user avatar

moskalenco_amoskalenco_a

9185 серебряных знаков19 бронзовых знаков

const result = arr.reduce((acc, rec, index) => {
    return (typeof acc[rec] !== 'undefined') 
      ? { ...acc, [rec]: acc[rec] + 1 } 
      : { ...acc, [rec]: 1 }
}, {})

Grundy's user avatar

Grundy

79.8k9 золотых знаков76 серебряных знаков133 бронзовых знака

ответ дан 6 апр 2020 в 12:11

Vitaliy Vyatkin's user avatar

2

Самый простой и верный вариант использовать метод .filter

[1,2,3,4,4,4,5,4,1,5,4].filter(item => item === 4).length // 5

ответ дан 8 ноя 2017 в 15:07

Максим Погребняк's user avatar

код по “эффективному алгоритму”, который описан выше:

   function duplicateCount(text){

let str = text.toLowerCase().split("").sort();
let resultArr = []; 
let k = 1;

for (let i of str){


if (i == str[k]){
if (!resultArr.includes(i)){
   resultArr.push(i);
    }
  }
  k++;
}

return resultArr.length
};
  

ответ дан 21 сен 2021 в 13:06

vlad_pikiner's user avatar

1

Вариант, проще всех перечисленных выше:

let arr = [1, 3, 4, 1, 1, 3, 4, 5];
let count = {};

for (let elem of arr) {
    if (count[elem] === undefined) {
    count[elem] = 1;
    } else {
    count[elem]++;
    }
}
console.log(count); // выведет {1: 3, 3: 2, 4: 2, 5: 1}

ответ дан 10 мая 2022 в 6:27

hiAlexander's user avatar

Как найти количество повторяющихся элементов массива?

Дан массив [ ‘-………’, ‘…..’, ‘-….-‘, ‘…..’ ] необходимо произвести подсчет элементов-дубликатов.
Как реализовать?


  • Вопрос задан

    более трёх лет назад

  • 10370 просмотров

const count = arr.reduce((acc, n) => (acc[n] = (acc[n] || 0) + 1, acc), {});

const duplicateCount = Object.values(count).filter(n => n > 1).length;

function arrayCountValues (arr) {
    var v, freqs = {};

    for (var i = arr.length; i--; ) { 
        v = arr[i];
        if (freqs[v]) freqs[v] += 1;
        else freqs[v] = 1;
    }
    return freqs;
}

Пригласить эксперта

const arrayOfDuplicateElements = [ '-.........', '.....', '-....-', '.....' ]

const getNumberOfDuplicateItems = arr => {
  const set = new Set()
  arr.forEach(el => set.add(el))

  const initialArrayLength = arr.length
  const uniqueArrayLength = [...set].length

  return initialArrayLength - uniqueArrayLength
}

console.log(getNumberOfDuplicateItems(arrayOfDuplicateElements))

or

const arrayOfDuplicateElements = [ '-.........', '.....', '-....-', '.....' ]

const getNumberOfDuplicateItems = arr => arr.length - [...new Set(arr)].length

console.log(getNumberOfDuplicateItems(arrayOfDuplicateElements))


  • Показать ещё
    Загружается…

18 мая 2023, в 06:33

500 руб./за проект

18 мая 2023, в 04:47

1000 руб./в час

18 мая 2023, в 04:36

5000 руб./за проект

Минуточку внимания

8 / 8 / 4

Регистрация: 05.10.2010

Сообщений: 137

1

Найти количество повторов в массиве

18.10.2010, 17:22. Показов 8701. Ответов 10


Студворк — интернет-сервис помощи студентам

Как найти количиство повторов в массиве длиной вводимой с клавы? О_о



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

18.10.2010, 17:22

10

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

18.10.2010, 17:25

2

Если удручает размер массива, вводимый с клавиатуры, то динамическое распределение памяти вам в помосчь.



0



Mr.X

Эксперт С++

3222 / 1749 / 435

Регистрация: 03.05.2010

Сообщений: 3,867

18.10.2010, 17:52

3

C++
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
//////////////////////////////////////////////////////////////////////////////////
//  Как найти количиство повторов в массиве длиной вводимой с клавы?
//////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <set>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////
typedef std::vector<int>    T_nums;
typedef std::set<int>       T_num_set;
//////////////////////////////////////////////////////////////////////////////////
int  get_identical_numbers_quantity(const T_nums&  nums)
{
    T_num_set  num_set(nums.begin(), nums.end());
    return  nums.size() - num_set.size();
}
//////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    std::cout << "Введите длину последовательности: ";
    int n;
    std::cin >> n;
    T_nums  nums(n);
    std::cout << "Введите "
              << n 
              << " целых чисел: "
              << std::endl;
    for(int i = 0; i < n; ++i)
    {
        std::cout << "-> ";
        std::cin >> nums[i];
    }
    std::cout << "В этой последовательности "
              << get_identical_numbers_quantity(nums)
              << " чисел, повторяющих уже существующие."
              << std::endl;
}



1



8 / 8 / 4

Регистрация: 05.10.2010

Сообщений: 137

18.10.2010, 21:37

 [ТС]

4

Спасибо! А можно попроще а то мы учим С++ месяц и меня за это… =)

Добавлено через 3 минуты
И можно типа ответ: повторяется (к примеру [5]) столько то раз =)



0



MILAN

899 / 793 / 186

Регистрация: 21.02.2009

Сообщений: 1,722

18.10.2010, 22:13

5

C++
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
#include <iostream>
#include <ctime>
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    srand((unsigned)time(NULL));
    int *arr;
    int size,count=0;
    cout<<"Введите длину массива: ";
    cin>>size;
    arr = new int[size];
    cout<<"Массив: ";
     for(int i=0; i<size; i++)
       {
           arr[i]=rand()%9;
           cout<<arr[i]<<"  ";
       }
     for(int i=0; i<size; i++)
       {
         for(int j=0; j<size; j++)
          {
            if(arr[i]==arr[j])
              {
                 count++;
              }
          }
         cout<<endl;
         cout<<"arr["<<i<<"]= "<<count;
         count=0;
       }
  system("pause");
  delete [] arr;
  return 0;
}



1



Mr.X

Эксперт С++

3222 / 1749 / 435

Регистрация: 03.05.2010

Сообщений: 3,867

18.10.2010, 22:40

6

C++
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
//////////////////////////////////////////////////////////////////////////////////
//  Как найти количиство повторов в массиве длиной вводимой с клавы?
//////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
#include <map>
//////////////////////////////////////////////////////////////////////////////////
typedef std::vector<int>    T_nums;
typedef std::map<int, int>  T_numbers_quantity;
//////////////////////////////////////////////////////////////////////////////////
void  print_identical_numbers_quantity(const T_nums&  nums)
{
    T_numbers_quantity  numbers_quantity;
    for(T_nums::const_iterator  num_it = nums.begin(); num_it != nums.end(); ++num_it)
    {
        ++numbers_quantity[*num_it];    
    }
 
    for(T_numbers_quantity::const_iterator  NQ_it = numbers_quantity.begin();
        NQ_it != numbers_quantity.end(); ++NQ_it)
    {
        std::cout << "Число "
                  << NQ_it->first
                  << " повторяется в массиве "
                  << NQ_it->second
                  << " раз."
                  << std::endl;
    }
}
//////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    std::cout << "Введите длину последовательности: ";
    int n;
    std::cin >> n;
    T_nums  nums(n);
    std::cout << "Введите "
              << n 
              << " целых чисел: "
              << std::endl;
    for(int i = 0; i < n; ++i)
    {
        std::cout << "-> ";
        std::cin >> nums[i];
    }
    print_identical_numbers_quantity(nums);
    std::cout << std::endl;
}



0



egorikem

8 / 8 / 4

Регистрация: 05.10.2010

Сообщений: 137

19.10.2010, 19:15

 [ТС]

7

Цитата
Сообщение от MILAN
Посмотреть сообщение

C++
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
#include <iostream>
#include <ctime>
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    srand((unsigned)time(NULL));
    int *arr;
    int size,count=0;
    cout<<"Введите длину массива: ";
    cin>>size;
    arr = new int[size];
    cout<<"Массив: ";
     for(int i=0; i<size; i++)
       {
           arr[i]=rand()%9;
           cout<<arr[i]<<"  ";
       }
     for(int i=0; i<size; i++)
       {
         for(int j=0; j<size; j++)
          {
            if(arr[i]==arr[j])
              {
                 count++;
              }
          }
         cout<<endl;
         cout<<"arr["<<i<<"]= "<<count;
         count=0;
       }
  system("pause");
  delete [] arr;
  return 0;
}

А можно чтоб вводил элементы массива сам человек!!!!



0



MILAN

899 / 793 / 186

Регистрация: 21.02.2009

Сообщений: 1,722

19.10.2010, 19:30

8

Да, конечно:

C++
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
#include <iostream>
#include <ctime>
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
        setlocale(LC_ALL,"Russian");
        srand((unsigned)time(NULL));
        int *arr;
        int size,count=0;
        cout<<"Введите длину массива: ";
        cin>>size;
        arr = new int[size];
          for(int i=0; i<size; i++)
           {
                   cout<<"Введите елемент: "<<i<<" ";
                   cin>>arr[i];
                   cout<<endl;
            }
          cout<<"Массив: ";
             for(int i=0; i<size; i++)
                {
                   cout<<arr[i]<<"  ";
               }
         
         for(int i=0; i<size; i++)
           {
         for(int j=0; j<size; j++)
                  {
            if(arr[i]==arr[j])
                          {
                 count++;
                          }
                  }
                 cout<<endl;
                 cout<<"arr["<<i<<"]= "<<count;
                 count=0;
           }
  system("pause");
  delete [] arr;
  return 0;
}



0



8 / 8 / 4

Регистрация: 05.10.2010

Сообщений: 137

23.10.2010, 12:30

 [ТС]

9

MILAN, А можно чтоб в конце выводилась одна строка и только с повтором а не все элементы???



0



MILAN

899 / 793 / 186

Регистрация: 21.02.2009

Сообщений: 1,722

23.10.2010, 12:40

10

Так пойдет?

C++
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
#include <iostream>
#include <ctime>
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
        setlocale(LC_ALL,"Russian");
        srand((unsigned)time(NULL));
        int *arr;
        int size,count=0;
        cout<<"Введите длину массива: ";
        cin>>size;
        arr = new int[size];
          for(int i=0; i<size; i++)
           {
                   cout<<"Введите елемент: "<<i<<" ";
                   cin>>arr[i];
                   cout<<endl;
            }
         for(int i=0; i<size; i++)
           {
             count=0;
             for(int j=0; j<size; j++)
              {
                if(arr[i]==arr[j])
                  {
                    count++;
                  }
              }
           if(count>1)
                 {
                    cout<<"arr["<<i<<"]= "<<count<<endl;
                  }
           }
  system("pause");
  delete [] arr;
  return 0;
}



0



8 / 8 / 4

Регистрация: 05.10.2010

Сообщений: 137

23.10.2010, 13:36

 [ТС]

11

Слых у тебя так сказать ошибка! Надо его сначала отсортировать!!!!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

23.10.2010, 13:36

11

Create a file for example demo.js and run it in console with node demo.js and you will get occurrence of elements in the form of matrix.

var multipleDuplicateArr = Array(10).fill(0).map(()=>{return Math.floor(Math.random() * Math.floor(9))});
console.log(multipleDuplicateArr);

var resultArr = Array(Array('KEYS','OCCURRENCE'));

for (var i = 0; i < multipleDuplicateArr.length; i++) {
  var flag = true;
  for (var j = 0; j < resultArr.length; j++) {
     if(resultArr[j][0] == multipleDuplicateArr[i]){
       resultArr[j][1] = resultArr[j][1] + 1;
       flag = false;
      }
  }
  if(flag){
    resultArr.push(Array(multipleDuplicateArr[i],1));
  }
}

console.log(resultArr);

You will get result in console as below:

[ 1, 4, 5, 2, 6, 8, 7, 5, 0, 5 ] . // multipleDuplicateArr
[ [ 'KEYS', 'OCCURENCE' ],        // resultArr
  [ 1, 1 ],
  [ 4, 1 ],
  [ 5, 3 ],
  [ 2, 1 ],
  [ 6, 1 ],
  [ 8, 1 ],
  [ 7, 1 ],
  [ 0, 1 ] ]

Для поиска одинаковых элементов в массиве нагляднее всего воспользоваться циклом:

const nums = [1, 2, 1, 4, 5, 1, 7, 8, 1, 10];

let count = 0;

for (let i = 0; i < nums.length; i +=1 ) {
  if (nums[i] === 1) {
    count += 1;
  }
}
// Вывод: 4

Или например, необходимо посчитать сколько раз встречается каждая цифра в исходном массиве, с помощью reduce:

const nums = [1, 2, 7, 4, 5, 2, 7, 8, 1, 10];

const res = nums.reduce((acc, i) => {
  if (acc.hasOwnProperty(i)) {
    acc[i] += 1;
  } else {
    acc[i] = 1;
  }
  return acc;
},{})
// Вывод: { '1': 2, '2': 2, '4': 1, '5': 1, '7': 2, '8': 1, '10': 1 }

Добавить комментарий