2013-03-19 2 views
2

У меня есть точно такой же Elem и List класс, как это определено на http://www.cplusplus.com/forum/beginner/73928/Проверьте, если все значения повторяются по крайней мере два раза в связанном списке

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

1,1,1,2,2 - true 
1,2 - false 

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

+0

Как насчет неуправляемых повторений? '1,2,1,2', это' true' или 'false'? – jrok

+0

Это будет считаться истинным, без необходимости отсортированных элементов. – waplet

ответ

2

Да, введите std::map<int,int>, где вы подсчитываете количество встречаемости каждого номера в списке. Для этого вычисления требуется один проход по всему списку.

Затем сделать еще один проход над std::map вы только что создали и выяснить, если все значения больше или равно 2.

0

функция будет выглядеть примерно так (непроверенный):

std::map<int,int> m_mapCount; 
    std::map<int,int>::iterator m_Iterator; 

    for (l.start(); !l.end(); l.next()) // put the content of your linkedlist to map 
    { 
     m_mapCount[l.current->num] += 1; 
    } 

    for (m_Iterator=m_mapCount.begin(); m_Iterator!=m_mapCount.end(); m_Iterator++) 
    { 
     if(m_Iterator->second >= 2) return true; 
    } 
0
bool twoormore() 
    { 
     int count = 0;// for counting elements in list 
     int temp;// temprorary element for sorting and logical part 
     int cik;// how much times the value has been mentioned 
     bool res = true;// function result 
     int * arr;// pointer for the upcoming dynamic array 
     for(start();!end();next()) 
     { 
      count++;// counting the elements 

     } 
     if(count != 0){ 
      arr = new int[count];//creating array 
      int i = 0; 
      for(start();!end();next()) 
      { 
       arr[i++] = current->num;//filling array 
      } 
      /** array sorting **/ 
      for(int i = 0;i < count;i++) 
       for(int j = 0; j < count; j++) 
       { 
        if(arr[j] > arr[i]) 
        { 
         temp = arr[i]; 
         arr[i] = arr[j]; 
         arr[j] = temp; 
        } 
       } 
      /** sort ends **/ 
      temp = arr[0]; // setting first element ar temp.. for upcoming check 
      cik = 1;// it's been its first time 
      for(int i = 1;i < count;i++) 
      { 
       if(arr[i] == temp) 
       { 
        cik++; continue;// if upciming element is equal to temprorary , then add 1 to counter.. and continue looping 
       }else 
       { 
        if(cik > 1) 
        { 
         temp = arr[i];// if everything ok, but element value changes. 
         cik = 1;// sets defualt 
         continue; 
        } 
        else 
        { 
         res = false;// other way, the value wasnt there two times 
         break; 
        } 
       } 


      } 
      delete arr;//deleting allocated space for array 
      return res;// returning bool, true or false. 
     } 
    } 
Смежные вопросы