2015-12-11 4 views
-4

Я принимаю вводный уровень C++. Я должен написать булеву функцию, которая проверяет наличие дубликатов вдоль векторов и возвращает истину и ложь, если нет дубликатовПоиск и сортировка массивов

#include<iostream> 
#include<vector> 
using namespace std; 
bool has_duplicates(const vector <int> &v); 


int main() { 

    vector<int> Vec(8); 
    Vec = { 20, 30, 40, 50, 10, 20, 5, 6 }; 
    has_duplicates(Vec); 
    return 0; 
} 
bool has_duplicates(const vector<int>& v) { 
    bool duplicatefound = false; 
    for (int i = 0; i < 8; i++) { // Check each other number in the array 
     for (int j = i; j < 8; j++) { // Check the rest of the numbers 
      while (j != i) {// Makes sure don't check number against itself 
       if (v[i] == v[j]) { 
        cout << "duplicate found" << endl; 
        duplicatefound = true; 
        break; 
       } 
      } 
     } 
    } 
    return duplicatefound; // Reset the boolean after each number entered has been checked 
} 
+2

Можете ли вы рассказать мне, что вы пробовали? Мы хотим помочь вам. но мы не из 0. делитесь своей идеей. –

+3

Stack Overflow - это сайт Q & A. Какой у Вас вопрос? – Pang

+0

Сначала создайте массив с некоторыми повторяющимися значениями. Затем перейдем к массиву. Внутри предыдущего цикла попытайтесь создать другой цикл и искать способ вернуть true, если вы найдете повторяющееся значение –

ответ

0

Там не очень простое решение вашей проблемы:

  1. Итерация через массив, с помощью цикла: for(int i=0; i < array_length; i++)
  2. в пределах этого цикла, чтобы использовать другую петлю, чтобы проверить, является ли какое-либо значение до одного, к которому i указует, равно your_array[i]. Если это так, вы нашли дубликат и можете return true, иначе петли будут запускаться только до тех пор, пока не будет достигнут конец массива, а затем вы можете return false. Таким образом, ваша целая функция будет что-то вроде:

    bool contains_duplicates(int array[], int len) { 
        for(int i=0; i < len; i++) { 
         for(int j=0; j < i; j++) { 
          if(array[j]==array[i]) { 
           return true; 
          } 
         } 
        } 
    
        return false; 
    } 
    

Надежда Я мог бы помочь, ура!
lindebear

+0

Извините, это мой первый раз, когда я использую поток стека, поэтому я не знаю, как правильно скопировать код, но мой выглядит почти так же, как ваш, просто дубликат bool _found false. Я попробую и вернусь к вам –

+0

Извините, я просто придумал лучшее решение! Проверьте здесь еще раз! – lindebear

+0

КПП. это очень помогло бы, если бы вы могли опубликовать решение, которое вы придумали до сих пор. – lindebear

-1

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

template< typename T> 
bool hasDuplicates(std::vector<T> vect) { 
    std::sort(vect.begin(), vect.end()); 
    T last; 
    typename vector<T>::iterator it; 
    for(it = vect.begin(); it < vect.end(); it++) { 
     if (vect.begin() != it) { 
      if(last == *it) { 
       return true; 
      } 
     } 
     last = *it; 
    } 
    return false; 
} 
+0

Я не знаком с шаблонами? –

+0

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

Смежные вопросы