Как найти в массиве два одинаковых числа

Дан массив с числами. Проверьте, есть ли в нём два одинаковых числа подряд.
Если есть – выведите ‘да’, а если нет – выведите ‘нет’

Моё решение такое:

var arr = [3, 1, 1, 12];
for (var i = 0; i > arr.length; i++) {
  for (var j = i + 1; j > arr.length; j++) {
    if (arr[i] === arr[j]) {
      alert('yes')
    } else {
      alert('no')
    }
  }

Но ничего не выводит alert. В чём проблема?

Bharatha's user avatar

Bharatha

5,2561 золотой знак17 серебряных знаков36 бронзовых знаков

задан 6 июн 2018 в 9:09

Keeps Keeps's user avatar

1

Проблема в том, что ты делаешь вывод для каждого числа в массиве. В случае нахождения подходящей пары надо прекращать проверку. А для неподходящих пар вообще ничего делать не надо.

function check(a) {
  for (var q=1; q<a.length; ++q) {
    if (a[q] === a[q-1]) {
      return true;
    }
  }
  
  return false;
}

console.log(check([3, 1, 1, 12]) ? "Да" : "Нет");

ответ дан 6 июн 2018 в 9:26

Qwertiy's user avatar

QwertiyQwertiy

120k24 золотых знака121 серебряный знак291 бронзовый знак

[3, 1, 1, 12].reduce((a, b) => (typeof a === 'number' && typeof b === 'number' && a === b ? console.info('Yes') : null, b), null);

ответ дан 6 июн 2018 в 9:15

3

Можно воспользоваться функцией Array.prototype.some

// Дословно:
// Существует ли элемент(не являющийся первым) равный предыдущему?
const hasSeqEq = arr => arr.some((el, i, arr) => i!=0 && el===arr[i-1]);

console.log(hasSeqEq([5, 1, 5, 2])); // false
console.log(hasSeqEq([5, 1, 5, 2, 2, 7])); // true

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


ES5:

// Дословно:
// Существует ли элемент(не являющийся первым) равный предыдущему?
function hasSeqEq(arr) {
  return arr.some(function(el, i, arr) {
    return i != 0 && el === arr[i - 1];
  });
}

console.log(hasSeqEq([5, 1, 5, 2])); // false
console.log(hasSeqEq([5, 1, 5, 2, 2, 7])); // true

ответ дан 6 июн 2018 в 9:32

vp_arth's user avatar

vp_arthvp_arth

27.1k2 золотых знака45 серебряных знаков76 бронзовых знаков

11

function f(arr) {
    for (let i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
            return true
        }
    }
    return false
}
let arr = [1, 2, 3, 4, 5, 6, 4, 8];
console.log(f(arr))

ответ дан 17 ноя 2020 в 18:47

Krovorgen's user avatar

KrovorgenKrovorgen

7684 серебряных знака16 бронзовых знаков

Проблема в том, что вы написали неправильное условие выхода из цикла.
i > arr.length – возвращает false на первой же проверке и цикл заканчивается не сделав ни одной итерации.

var arr = [3, 1, 1, 12]; 

for (var i = 0; i < arr.length; i++){
    for (var j = i + 1; j < arr.length; j++){
        if (arr[i] === arr[j]){
            alert('yes')
        } else {
            alert('no');
        }
    }
}

ответ дан 6 июн 2018 в 9:12

Darth's user avatar

DarthDarth

13k2 золотых знака25 серебряных знаков56 бронзовых знаков

Given an array of n integers. The task is to print the duplicates in the given array. If there are no duplicates then print -1. 

Examples: 

Input: {2, 10,10, 100, 2, 10, 11,2,11,2}
Output: 2 10 11

Input: {5, 40, 1, 40, 100000, 1, 5, 1}
Output: 5 40 1

Note: The duplicate elements can be printed in any order.

Simple Approach: The idea is to use nested loop and for each element check if the element is present in the array more than once or not. If present, then store it in a Hash-map. Otherwise, continue checking other elements.

Below is the implementation of the above approach:

C++

#include <bits/stdc++.h>

using namespace std;

void findDuplicates(int arr[], int len)

{

    bool ifPresent = false;

    vector<int> al;

    for(int i = 0; i < len - 1; i++)

    {

        for(int j = i + 1; j < len; j++)

        {

            if (arr[i] == arr[j])

            {

                auto it = std::find(al.begin(),

                                    al.end(), arr[i]);

                if (it != al.end())

                {

                    break;

                }

                else

                {

                    al.push_back(arr[i]);

                    ifPresent = true;

                }

            }

        }

    }

    if (ifPresent == true)

    {

        cout << "[" << al[0] << ", ";

        for(int i = 1; i < al.size() - 1; i++)

        {

            cout << al[i] << ", ";

        }

        cout << al[al.size() - 1] << "]";

    }

    else

    {

        cout << "No duplicates present in arrays";

    }

}

int main()

{

    int arr[] = { 12, 11, 40, 12,

                  5, 6, 5, 12, 11 };

    int n = sizeof(arr) / sizeof(arr[0]);

    findDuplicates(arr, n);

    return 0;

}

Java

import java.util.ArrayList;

public class GFG {

    static void findDuplicates(

      int arr[], int len)

    {

        boolean ifPresent = false;

        ArrayList<Integer> al = new ArrayList<Integer>();

        for (int i = 0; i < len - 1; i++) {

            for (int j = i + 1; j < len; j++) {

                if (arr[i] == arr[j]) {

                    if (al.contains(arr[i])) {

                        break;

                    }

                    else {

                        al.add(arr[i]);

                        ifPresent = true;

                    }

                }

            }

        }

        if (ifPresent == true) {

            System.out.print(al + " ");

        }

        else {

            System.out.print(

                "No duplicates present in arrays");

        }

    }

    public static void main(String[] args)

    {

        int arr[] = { 12, 11, 40, 12, 5, 6, 5, 12, 11 };

        int n = arr.length;

        findDuplicates(arr, n);

    }

}

Python3

def findDuplicates(arr, Len):

    ifPresent = False

    a1 = []

    for i in range(Len - 1):

        for j in range(i + 1, Len):

            if (arr[i] == arr[j]):

                if arr[i] in a1:

                    break

                else:

                    a1.append(arr[i])

                    ifPresent = True

    if (ifPresent):

        print(a1, end = " ")

    else:

        print("No duplicates present in arrays")

arr = [ 12, 11, 40, 12, 5, 6, 5, 12, 11 ]

n = len(arr)

findDuplicates(arr, n)

C#

using System;

using System.Collections.Generic;

class GFG{

static void findDuplicates(int[] arr, int len)

{

    bool ifPresent = false;

    List<int> al = new List<int>();

    for(int i = 0; i < len - 1; i++)

    {

        for(int j = i + 1; j < len; j++)

        {

            if (arr[i] == arr[j])

            {

                if (al.Contains(arr[i]))

                {

                    break;

                }

                else

                {

                    al.Add(arr[i]);

                    ifPresent = true;

                }

            }

        }

    }

    if (ifPresent == true)

    {

        Console.Write("[" + al[0] + ", ");

        for(int i = 1; i < al.Count - 1; i++)

        {

            Console.Write(al[i] + ", ");

        }

        Console.Write(al[al.Count - 1] + "]");

    }

    else

    {

        Console.Write("No duplicates present in arrays");

    }

}

static void Main()

{

    int[] arr = { 12, 11, 40, 12,

                  5, 6, 5, 12, 11 };

    int n = arr.Length;

    findDuplicates(arr, n);

}

}

Javascript

<script>

function findDuplicates(arr, len) {

    let ifPresent = false;

    let al = new Array();

    for (let i = 0; i < len - 1; i++) {

        for (let j = i + 1; j < len; j++) {

            if (arr[i] == arr[j]) {

                if (al.includes(arr[i])) {

                    break;

                }

                else {

                    al.push(arr[i]);

                    ifPresent = true;

                }

            }

        }

    }

    if (ifPresent == true) {

        document.write(`[${al}]`);

    }

    else {

        document.write("No duplicates present in arrays");

    }

}

let arr = [12, 11, 40, 12, 5, 6, 5, 12, 11];

let n = arr.length;

findDuplicates(arr, n);

</script>

Time Complexity: O(N2
Auxiliary Space: O(N)

Efficient Approach: Use unordered_map for hashing. Count frequency of occurrence of each element and the elements with frequency more than 1 is printed. unordered_map is used as range of integers is not known. For Python, Use Dictionary to store number as key and it’s frequency as value. Dictionary can be used as range of integers is not known.

Below is the implementation of the above approach:

C++

#include <bits/stdc++.h>

using namespace std;

void printDuplicates(int arr[], int n)

{

    unordered_map<int, int> freq;

    for (int i=0; i<n; i++)

        freq[arr[i]]++;

    bool dup = false;

    unordered_map<int, int>:: iterator itr;

    for (itr=freq.begin(); itr!=freq.end(); itr++)

    {

        if (itr->second > 1)

        {

            cout << itr->first << " ";

            dup = true;

        }

    }

    if (dup == false)

        cout << "-1";

}

int main()

{

    int arr[] = {12, 11, 40, 12, 5, 6, 5, 12, 11};

    int n = sizeof(arr) / sizeof(arr[0]);

    printDuplicates(arr, n);

    return 0;

}

Java

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

public class FindDuplicatedInArray

{

    public static void main(String[] args)

    {

        int arr[] = {12, 11, 40, 12, 5, 6, 5, 12, 11};

        int n = arr.length;

        printDuplicates(arr, n);

    }

    private static void printDuplicates(int[] arr, int n)

    {

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

        int count = 0;

        boolean dup = false;

        for(int i = 0; i < n; i++){

            if(map.containsKey(arr[i])){

                count = map.get(arr[i]);

                map.put(arr[i], count + 1);

            }

            else{

                map.put(arr[i], 1);

            }

        }

        for(Entry<Integer,Integer> entry : map.entrySet())

        {

            if(entry.getValue() > 1){

                System.out.print(entry.getKey()+ " ");

                dup = true;

            }

        }

        if(!dup){

            System.out.println("-1");

        }

    }

}

Python3

def printDuplicates(arr):

    dict = {}

    for ele in arr:

        try:

            dict[ele] += 1

        except:

            dict[ele] = 1

    for item in dict:

        if(dict[item] > 1):

            print(item, end=" ")

    print("n")

if __name__ == "__main__":

    list = [12, 11, 40, 12,

            5, 6, 5, 12, 11]

    printDuplicates(list)

C#

using System;

using System.Collections.Generic;

class GFG

{

    static void printDuplicates(int[] arr, int n)

    {

        Dictionary<int,

                   int> map = new Dictionary<int,

                                             int>();

        int count = 0;

        bool dup = false;

        for (int i = 0; i < n; i++)

        {

            if (map.ContainsKey(arr[i]))

            {

                count = map[arr[i]];

                map[arr[i]]++;

            }

            else

                map.Add(arr[i], 1);

        }

        foreach (KeyValuePair<int,

                              int> entry in map)

        {

            if (entry.Value > 1)

                Console.Write(entry.Key + " ");

            dup = true;

        }

        if (!dup)

            Console.WriteLine("-1");

    }

    public static void Main(String[] args)

    {

        int[] arr = { 12, 11, 40, 12,

                     5, 6, 5, 12, 11 };

        int n = arr.Length;

        printDuplicates(arr, n);

    }

}

Javascript

<script>

function printDuplicates(arr, n)

{

    var freq = new Map();

    for(let i = 0; i < n; i++)

    {

        if (freq.has(arr[i]))

        {

            freq.set(arr[i], freq.get(arr[i]) + 1);

        }

        else

        {

            freq.set(arr[i], 1);

        }

    }

    var dup = false;

    for(let [key, value] of freq)

    {

        if (value > 1)

        {

            document.write(key + " ");

            dup = true;

        }

    }

    if (dup == false)

        document.write("-1");

}

var arr = [ 12, 11, 40, 12,

            5, 6, 5, 12, 11 ];

var n = arr.length;

printDuplicates(arr, n);

</script>

Time Complexity: O(N)
Auxiliary Space: O(N)   

Another Efficient Approach(Space optimization):            

  • First we will sort the array for binary search function.
  • we will find index at which arr[i] occur first time lower_bound 
  • Then , we will find index at which arr[i] occur last time upper_bound            
  • Then check if diff=(last_index-first_index+1)>1         
  • If diff >1 means it occurs more than once and print                         

 Below is the implementation of the above approach:

C++

#include <bits/stdc++.h>

using namespace std;

void printDuplicates(int arr[], int n)

{  

    sort(arr,arr+n);

    cout<<"[";

    for(int i = 0 ; i < n ;i++)

    {

      int first_index = lower_bound(arr,arr+n,arr[i])- arr;

      int last_index = upper_bound(arr,arr+n,arr[i])- arr-1;

      int occur_time = last_index-first_index+1;

      if(occur_time > 1 )

      {  i=last_index;

       cout<<arr[i]<<", ";  }

    }   cout<<"]";

}

int main()

{   int arr[] = {12, 11, 40, 12, 5, 6, 5, 12, 11};

    int n = sizeof(arr) / sizeof(arr[0]);

    printDuplicates(arr, n);

    return 0;

}

Python3

def printDuplicates(arr, n):

    arr.sort() 

    print("[", end="") 

    i = 0 

    while i < n:

        first_index = arr.index(arr[i])

        last_index = n - arr[::-1].index(arr[i]) - 1

        occur_time = last_index - first_index + 1 

        if occur_time > 1

            i = last_index 

            print(arr[i], end=", "

        i += 1 

    print("]"

arr = [12, 11, 40, 12, 5, 6, 5, 12, 11]

n = len(arr)

printDuplicates(arr, n)

Java

import java.io.*;

import java.util.*;

class GFG {

    public static int lowerBound(int[] arr, int target)

    {

        int lo = 0, hi = arr.length - 1;

        int ans = -1;

        while (lo <= hi) {

            int mid = lo + (hi - lo) / 2;

            if (arr[mid] >= target) {

                ans = mid;

                hi = mid - 1;

            }

            else {

                lo = mid + 1;

            }

        }

        return ans;

    }

    public static int upperBound(int[] arr, int target)

    {

        int lo = 0, hi = arr.length - 1;

        int ans = -1;

        while (lo <= hi) {

            int mid = lo + (hi - lo) / 2;

            if (arr[mid] <= target) {

                ans = mid;

                lo = mid + 1;

            }

            else {

                hi = mid - 1;

            }

        }

        return ans;

    }

    static void printDuplicates(int[] arr, int n)

    {

        Arrays.sort(arr);

        System.out.print("[");

        for (int i = 0; i < n; i++) {

            int firstIndex = lowerBound(arr, arr[i]);

            int lastIndex = upperBound(arr, arr[i]);

            int occurTime = lastIndex - firstIndex

                            + 1;

            if (occurTime

                > 1) {

                i = lastIndex;

                System.out.print(arr[i] + ", ");

            }

        }

        System.out.println("]");

    }

    public static void main(String[] args)

    {

        int[] arr = { 12, 11, 40, 12, 5, 6, 5, 12, 11 };

        int n = arr.length;

        printDuplicates(arr, n);

    }

}

Javascript

function printDuplicates(arr, n) {

    arr.sort();

    console.log("[");

    for (let i = 0; i < n; i++)

    {

        let first_index = arr.indexOf(arr[i]);

        let last_index = arr.lastIndexOf(arr[i]);

        let occur_time = last_index - first_index + 1;

        if (occur_time > 1) {

            i = last_index;

            console.log(arr[i] + ", ");

        }

    }

    console.log("]");

}

let arr = [12, 11, 40, 12, 5, 6, 5, 12, 11];

let n = arr.length;

printDuplicates(arr, n);

C#

using System;

class MainClass {

    static void printDuplicates(int[] arr, int n) {

        Array.Sort(arr);

        Console.Write("[");

        for (int i = 0; i < n; i++) {

            int first_index = Array.IndexOf(arr, arr[i]);

            int last_index = Array.LastIndexOf(arr, arr[i]);

            int occur_time = last_index - first_index + 1;

            if (occur_time > 1) {

                i = last_index;

                Console.Write(arr[i] + ", ");

            }

        }

        Console.Write("]");

    }

    static void Main() {

        int[] arr = {12, 11, 40, 12, 5, 6, 5, 12, 11};

        int n = arr.Length;

        printDuplicates(arr, n);

    }

}

Time Complexity: O(n*log2n)
Auxiliary Space: O(1)

Related Post : 
Print All Distinct Elements of a given integer array 
Find duplicates in O(n) time and O(1) extra space | Set 1 
Duplicates in an array in O(n) and by using O(1) extra space | Set-2 
Print all the duplicates in the input string

This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Last Updated :
18 Apr, 2023

Like Article

Save Article

#статьи

  • 23 янв 2023

  • 0

Задача: проверить массив на дубликаты

Решаем задачи, которые дают программистам на собеседованиях в IT-компаниях. Сегодня ищем в массиве повторяющиеся элементы.

Иллюстрация: Polina Vari для Skillbox Media

Дмитрий Зверев

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.


Условие. Дан массив целых чисел — nums. Необходимо написать функцию, которая возвращает true, если в этом массиве хотя бы одно число повторяется дважды. Если же все элементы уникальны, функция должна вернуть false.

Ввод: nums = [1,2,3,1]
Вывод: true

Ввод: nums = [1,2,3,4]
Вывод: false

Ввод: nums = [1,1,1,3,3,4,3,2,4,2]
Вывод: true

Решить эту задачу самостоятельно и на разных языках программирования можно на LeetCode. Наше решение взято из телеграм-канала Сергея Cracking code interview.

Решение

При решении подобных задач важно выбрать подходящий тип данных. Здесь мы исходим из такой логики: «повторяется дважды» → значит, ищем дубликаты. Следовательно, выбираем множество (set).

Мы создадим пустое множество и будем обходить весь массив, просто проверяя, находится ли элемент во множестве:

  • если он ещё не находится — добавляем его;
  • если элемент уже там — значит, мы встретили повторяющийся элемент и просто возвращаем true.

public boolean containsDuplicate(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for (int i : nums) {
        if (set.contains(i)) {
            return true;
        } else {
            set.add(i);
        }
    }
    return false;
}

Результаты

Временная сложность: O(n) — так как в самом плохом случае мы проходимся по всему массиву.

Ёмкостная сложность: O(1) — нам нужно заранее определённое количество места в памяти.

Научитесь: Профессия Java-разработчик
Узнать больше

0 / 0 / 0

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

Сообщений: 4

1

Нахождение в массиве двух одинаковых чисел

07.12.2009, 19:02. Показов 7177. Ответов 13


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

Здравствуйте. Застрял на задаче, решил попросить у вас помощи. Суть её в том, что из файла считывается массив целых чисел, в нём находятся все числа, которые встречаются в этом массиве ровно два раза, и эти числа выводятся в другой файл. Задача на С++. Прошу помочь, кто сможет и кто захочет выделить время. Заранее спасибо.
ЗЫ: поиск не помог.



0



Programming

Эксперт

94731 / 64177 / 26122

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

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

07.12.2009, 19:02

Ответы с готовыми решениями:

Нахождение одинаковых чисел в массиве
Здрасьте всем, есть небольшой вопрос.

Имеется массив из пяти элементов. Необходимо найти в нем…

Поиск двух одинаковых чисел в двумерном массиве
Здравствуйте, уважаемые форумчане. Помогите решить задачу (задачка у нас из разряда гуру):
Массив…

среди чисел k,l,r два одинаковых,а в третье отлично от них.Переменной n присвоить значение числа,отличного от двух одинаковых
среди чисел k,l,r два одинаковых,а в третье отлично от них.Переменной n присвоить значение…

Нахождение одинаковых записей при равенстве двух полей
Нужен запрос который будет находить одинаковые записи, если равны два поля. Если первые поля равны,…

13

Darky

Быдлокодер

512 / 298 / 85

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

Сообщений: 892

07.12.2009, 19:54

2

Проверяйте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <conio.h>
#include <stdio.h>
#define SIZE 255
using namespace std;
int main(void)
{
const int n = 5;
  int i,j,kol=0;
  int A[SIZE];
  freopen("input.txt","rt",stdin);
  freopen("output.txt","wt",stdout);
    for (i=0;EOF!=0;i++)
         cin>>A[i];
    for(i=0;i<n-1;i++)  // идем с 0 по n - 2 элемент
    for(j=i++;j<n;j++) // идем с i + 1 по n - 1 элемент
          if(A[i] == A[j]) // если равны i и j элементы выводим
             cout<<A[i];
}



0



Эксперт С++

4726 / 2547 / 757

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

Сообщений: 4,568

07.12.2009, 20:26

3

Darky,

for(i=0;i<n-1;i++) // идем с 0 по n – 2 элемент
for(j=i++;j<n;j++) // идем с i + 1 по n – 1 элемент
if(A[i] == A[j]) // если равны i и j элементы выводим
cout<<A[i];

При таком коде условие

которые встречаются в этом массиве ровно два раза

не выполняется. У тебя вывод сразу же при первом повторе элементов, а дальше есть они или нет ты не проверяешь (вернее – если еще раз встретится элемент (третий или четвертый раз), снова вывод на экран)



0



Быдлокодер

512 / 298 / 85

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

Сообщений: 892

07.12.2009, 21:11

4

valeriikozlov, Да, условие неверно прочел.
И как? В последнем if делать вложенное условие, а в конце вывод и break;?



0



Эксперт С++

4726 / 2547 / 757

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

Сообщений: 4,568

07.12.2009, 21:21

5

Ну во первых, что бы точно убедится, два раза или больше встречается число, нужно пройтись по массиву до конца. Можно например завести счетчик. Если в конце счетчик равен 2, то число выводим на экран. Но сначала лучше проверить от j=0 до j=i-1, встречалось ли это число уже или нет. Если нет то запускаем наш счетчик со значением 1 в остаток массива с j=i+1 до j<n, увеличивая наш счетчик на 1 каждый раз когда встречается такое же число.



0



IT_Exp

MCSD: APP BUILDER

8794 / 1073 / 104

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

Сообщений: 12,603

07.12.2009, 21:25

6

Airwind,

массив целых чисел, в нём находятся все числа, которые встречаются в этом массиве ровно два раза

вот часть кода, которая находит искомые числа и выводит их на экран:

C++
1
2
3
4
5
6
7
8
#include <map>
#include <algorithm>
 
int arr[100]; // какой-то массив
 
std::map<int, size_t> z;
for (size_t i=0; i<100; i++) ++z[arr[i]];
for (size_t i=0; i<100; i++) if (z[arr[i]] == 2) std::cout << arr[i]; }



0



Быдлокодер

512 / 298 / 85

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

Сообщений: 892

07.12.2009, 21:26

7

Товарищу Airwind теперь осталось собрать это все воедино и оформить в код. Я думаю, это задача не самая трудная



0



Эксперт С++

4726 / 2547 / 757

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

Сообщений: 4,568

07.12.2009, 21:34

8

Есть одно но. Код Rififi выводит на экран только числа, которые встречаются 2 раза. Но выводит их два раза на экран.



0



MCSD: APP BUILDER

8794 / 1073 / 104

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

Сообщений: 12,603

07.12.2009, 22:22

9

valeriikozlov,

Код Rififi выводит на экран только числа, которые встречаются 2 раза. Но выводит их два раза на экран.

Да, верно.
Чтобы этого не посходило, нужно пробегаться по map а не по массиву.



0



Андрейка

424 / 228 / 87

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

Сообщений: 744

07.12.2009, 22:47

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
#include <iostream>
#include <set>
#include <algorithm>
int main()
{
    int arr[] = {1,1,2,2,3,3,3,4,2,4,4,4,5,5};
    std::multiset<int>s(arr,arr+sizeof(arr)/sizeof(*arr));
    for (std::multiset<int>::iterator iter = s.begin() ; iter!=s.end();)
    {
        int k = s.count(*iter);
        if (k==2)
        {
            std::cout<<*iter<<' ';
            s.erase(iter++);
        }
        else
        {
            ++iter;
        }
    }
    system("pause");
    return 0;
}

выводит по разу числа которые повторяются 2 раза )



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11757 / 7257 / 1720

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

Сообщений: 13,265

08.12.2009, 00:14

11

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

из файла считывается массив целых чисел, в нём находятся все числа, которые встречаются в этом массиве ровно два раза, и эти числа выводятся в другой файл.

Без массива и на С, но вроде работает

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
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
#include <stdio.h>
#include <stdlib.h>
 
#define FIN_NAME "in.txt"
#define FOUT_NAME "out.txt"
#define MATCHES_NEEDED 2
 
/*
    из файла считывается массив целых чисел, в нём находятся все числа, 
    которые встречаются в этом массиве ровно два раза, и эти числа выводятся в другой файл.
*/
 
typedef struct vt {
    int value;
    size_t count;
    struct vt *next;
} Value_t;
 
Value_t *newVal(Value_t *last_val, int value){
    Value_t *pVal;
    
    if ( (pVal = (Value_t*)malloc(sizeof(Value_t))) == NULL ){
        perror("Memory error!n");
        exit(1);
    }
    pVal->value = value;
    pVal->count = 1;
    pVal->next = NULL;
    
    if ( last_val != NULL )
        last_val->next = pVal;
    
    return pVal;
}
    
 
int main(void){
    FILE *fin, *fout;
    int tmp;
    Value_t *first, *last, *pVt;
    
    if ( (fin = fopen(FIN_NAME, "r")) == NULL ){
        perror("Can't open input file!n");
        exit(1);
    }
    
    first = NULL;
    
    while ( fscanf(fin, "%d", &tmp) == 1 ){
        for ( pVt = first; pVt != NULL && pVt->value != tmp; pVt = pVt->next )
            ;
        if ( pVt == NULL ){
            for ( last = first; last != NULL && last->next != NULL; last = last->next )
                ;
            pVt = newVal(last, tmp);
            if ( first == NULL )
                first = pVt;
        }
        else {
            pVt->count += 1;
        }
    }
    
    fclose(fin);
    
    if ( first == NULL ){
        perror("Shit happens!n");
        exit(1);
    }
    
    if ( (fout = fopen(FOUT_NAME, "w")) == NULL ){
        perror("Can't open output file!n");
        exit(1);
    }
    
    for ( pVt = first; pVt != NULL; pVt = pVt->next )
        if ( pVt->count == MATCHES_NEEDED )
            fprintf(fout, "%dn", pVt->value);
    
    fclose(fout);
    
    while ( first != NULL ){
        pVt = first->next;
        free(first);
        first = pVt;
    }
    
    exit(0);
}



0



Airwind

0 / 0 / 0

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

Сообщений: 4

08.12.2009, 19:26

 [ТС]

12

Э… м… даже не знаю, как сказать…
В общем, мы пока только начали изучать язык, таких сложных функций не проходили…
Вот моя попытка его написать — разумеется, неправильная. Её бы лучше модифицировать…

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
using namespace std;
void main()
{
    ifstream in("input.txt");
    ofstream out("output.txt");
    int A[50], n, k, S=0, g=0;
    in>>n;
    for (int i=0;i<n;i++)
        in>>A[i];
    k=A[0];
        for(int i=0;i<n;i++)
        if(A[i]==k)
        {
            k=A[i];
            S++;
        }
    if (S==1)
        out<<k<<' ';
    else
        out<<"No number"<<endl;
}



0



valeriikozlov

Эксперт С++

4726 / 2547 / 757

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

Сообщений: 4,568

09.12.2009, 05:24

13

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
#include <fstream>
using namespace std;
void main()
{
        ifstream in("input.txt");
        ofstream out("output.txt");
        int A[50], n, S, g=0, i, j;
        in>>n;
        for (i=0;i<n;i++)
                in>>A[i];
        for(i=1;i<n-1;i++)
        {
            S=0; 
            for(j=0; j<i; j++)
                if(A[i]==A[j])
                   S=2;
            for(j=i+1; j<n; j++)
                if(A[i]==A[j])
                   S++;
            if (S==1)
            {
                out<<A[i]<<" ";
                g=1;
            }
        }
        if(g==0)
            out<<"No number"<<endl;
}



0



Airwind

0 / 0 / 0

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

Сообщений: 4

12.12.2009, 20:12

 [ТС]

14

Спасибо. Только, если позволите: код несколько неправильный, он не учитывает первую цифру. Вот правильный.

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
#include <fstream>
using namespace std;
void main()
{
        ifstream in("input.txt");
        ofstream out("output.txt");
        int A[50], n, S, g=0, i, j;
        in>>n;
        for (i=0;i<n;i++)
                in>>A[i];
        for(i=0;i<n-1;i++)
                {
                        S=0; 
                        for(j=0; j<i; j++)
                if(A[i]==A[j])
                   S=2;
                        for(j=i+1; j<n; j++)
                                if(A[i]==A[j])
                   S++;
                        if (S==1)
                        {
                out<<A[i]<<" ";
                                g=1;
                        }
        }
        if(g==0)
                        out<<"No number"<<endl;
}



0



Есть два массива:

let km = [25, 45, 95, 125, 150, 200, 325, 250, 165, 350]

let cof = [1, 1.5, 1, 1.5, 1.2, 1.5, 1 , 0.5, 1.2, 1.5];

Мне нужно найти одинаковые числа в массиве (cof) и сложить числа другого массива(km) в зависимости какой индекс у одинаковых чисел был в (cof). Например:
В этом варианте правильный ответ 445 (25 + 95 + 325 ), 720(45 + 125 + 200 + 350), 315(150+165)
так как в массиве одинаковые числа стоят на индексах 0, 2, 6 и 1, 3, 5, 9 и 4, 8.

Мой код выглядит так:

let km = [25, 45, 95, 125, 150, 200, 325, 250, 165, 350]

let cof = [1, 1.5, 1, 1.5, 1.2, 1.5, 1 , 0.5, 1.2, 1.5];

let itog = [];


	for (let i = 0; i < cof.length; i++) {
		
		for(let k = i + 1; k < cof.length; k++){
			
			if(cof[i] === cof[k]){

				itog[i] = km[i] + km[k];

				
			}

		}
		
	}
	console.log(itog)

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

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