Подсчитать разные элементы массива

0

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

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

struct input
{
    int emp_age, emp_paid;
};

И это код, n представляет число всех людей

int diff_sum (int n, input* t)
{
    int uniq_num = n;

    for(int i = 0; i < n; i++)
        {
            for(int j = i; j < n; j++)
                {
                    if((t[j].emp_age == t[i].emp_age) && (i!=j))
                        {
                            uniq_num = uniq_num - 1;
                        }
                }
        }
    cout << uniq_num << endl;
    return 0;
}

Программный тест 10 раз, а некоторые из них - это хорошо, но для некоторых тестов он сказал, что это неправильно. Я не знаю, как работает тестовый движок, и я также не знаю, какова проблема.

  • 0
    Сначала вы должны показать или записать входные данные и получить конкретные входные данные, которые дают неправильный результат. Тогда вы знаете, с чего начать.
Теги:

4 ответа

1
Лучший ответ

Одной из возможностей было бы добавить все элементы в контейнер STL с уникальными значениями:

int diff_sum (int n, input* t)
{
    std::set<int> ages;
    for(int i = 0; i < n; i++)
        ages.insert(t[i].emp_age);

    return ages.size();
}
  • 1
    Я думаю, что вы имеете в виду std::set .
  • 0
    Черт возьми. Я имел в виду набор только что написал список. Благодарю.
3

Рассмотрим это: 10 10 10. Подумайте о i и j указывая на элементы:

uniq_num = 3
10 10 10
 i  j    => uniq_num = 2

10 10 10
 i     j => uniq_num = 1

10 10 10
    i  j => uniq_num = 0!!!!

Итак, мы видим, что во второй внешней итерации мы сравниваем два числа, которые мы уже знаем, одинаковы. Они уже косвенно сравниваются.

Предполагая, что вам не разрешено использовать какие-либо стандартные средства библиотеки (если да, то почему вы не так? Это было бы тривиально с помощью std::set !), Я работал бы в противоположном порядке.

  • Начните с unique=0.
  • Посмотрите на первый элемент. Инкрементный счет.
  • Посмотрите на следующий элемент. Сравните его со всеми предыдущими элементами. Если они не совпадают, счетчик увеличивается.
  • Повторение.

(Имейте в виду, что это не лучший алгоритм, и это не то, что я бы сделал для больших ресурсов, но довольно просто объяснить и реализовать с использованием самых основных концепций C++.)

1

Алгоритм:

  1. Найдите минимальный и максимальный возраст (позвоните на них min_age и max_age)

  2. Выделите массив с max_age-min_age + 1 запись (пусть назовите его age_arr)

  3. Задайте все записи в age_arr до 0

  4. Для каждой структуры x задайте 1 в записи # x.emp_age-min_age

  5. Суммируйте все значения (0s или 1s) в age_arr, удалите age_arr и верните результат

Реализация:

//Phase 1
int min_age = 1000; // Assumption!!!
int max_age =    0; // Assumption!!!
for(int i=0; i<n; i++)
{
    if (min_age > t[i].emp_age)
        min_age = t[i].emp_age;
    if (max_age < t[i].emp_age)
        max_age = t[i].emp_age;
}

//Phase 2
int age_arr_size = max_age-min_age+1;
int age_arr[] = new int[age_arr_size];

//Phase 3
for(int age=0; age<age_arr_size; age++)
    age_arr[age] = 0;

//Phase 4
for(int i=0; i<n; i++)
    age_arr[t[i].emp_age-min_age] = 1;

//Phase 5
int age_count = 0;
for(int age=0; age<age_arr_size; age++)
    age_count += age_arr[age];
delete[] age_arr;
return age_count;
0

Проблема в том, что ваш код будет недооценивать количество уникальных возрастов:

например, говорят, что возраст {1,2,3,4,1,5,6,1,7}

Очевидно, здесь существует 7 уникальных возрастов, а n = 9.

В вашем коде единственное время, когда uniq_num будет уменьшено, - это когда я = 0 (когда uniq_num уменьшается на 2) и я = 4 (когда uniq_num уменьшается на другое 1).

Последний случай - двойной подсчет, поэтому ваш алгоритм дает ответ 6 вместо 7.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню