Топ 5 самых частых из массива переполнения стека

Привет, у меня есть массив, и я надеюсь получить топ-5 наиболее часто встречающихся из этого массива.

static std::string pickRandomStockSymbol()
{
static std::string stockSymbols[] = {"SIRI", "INTC", "ZNGA", "BBRY", "MSFT",
"QQQ", "CSCO", "FB", "MU", "DELL", "AMAT", "NWSA", "AAPL", "AFFY", "ORCL",
"YHOO", "GRPN", "MDLZ", "VOD", "CMCSA" };

return stockSymbols[rand() % 20];

^^ это массив, который я буду использовать.

транзакции создаются случайным образом с использованием этой структуры:

struct Transaction
{
string stockSymbol;     // String containing the stock symbol, e.g. "AAPL"string buyerName;       // String containing the buyer's name e.g. "Mr Brown"int buyerAccount;       // Integer containing an eight digit account code
int numShares;          // Integer containing the number of sold shares
int pricePerShare;      // Integer containing the buy price per share
};

именно в этой функции я планирую сделать это, я просто не знаю, как я к этому подхожу:

string* Analyser::topFiveStocks()
{

return new string[5];
}

есть ли кто-нибудь, кто хочет показать мне, как я могу пройти через транзакции, чтобы получить эти 5 лучших элементов?

если потребуется дополнительная информация, я буду более чем рад предоставить.

Заранее спасибо, Андрей

0

Решение

Вы могли бы использовать std::unordered_map с символом акции в качестве ключа и счет транзакции в качестве значения. Затем просто поместите пять самых высоких в std::vector и верни это.

Что касается размещения верхнего N в векторе, вы могли бы сохранить его отсортированным и пересортировать его после каждой вставки, чтобы запас с наибольшим количеством транзакций был первым. Тогда легко увидеть, имеет ли текущий запас при итерации по карте большее количество транзакций, чем последний элемент в векторе (который является элементом в векторе с наименьшим количеством транзакций), затем добавьте его в вектор и повторно сортировать это.


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

Это может быть что-то вроде этого:

using transaction_map_type = std::unordered_map<std::string, unsigned int>;

transaction_map_type transactions;

// ...

std::vector<std::string> topFiveStocks()
{

std::vector<transaction_map_type::value_type> all_trans;

// Copy all transaction into our vector
std::copy(std::begin(transactions), std::end(transactions),
std::back_inserter(all_trans));

// Now sort the transactions
std::sort(std::begin(all_trans), std::end(all_trans),
[](const transaction_map_type::value_type& t1,
const transaction_map_type::value_type& t2)
{ return t1.second > t2.second; });

// And get the top five (or less) results into a separate vector
std::vector<std::string> top_five;

auto count = std::min(5UL, all_trans.size());
for (unsigned i = 0; i < count; i++)
top_five.push_back(all_trans[i].first);

return top_five;
}

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

Замечания: Это решение не проверено, просто написано в браузере. Может даже не скомпилировать.

2

Другие решения

Просто отсортируйте массив и затем зациклите его, чтобы вычислить самый длинный интервал элементов, которые равны.

0

Накопить биржевые символы:

  • счет в map<string, int>
  • самые высокие 5 символов в set<string>
  • самая низкая частота старших 5 символов в int
  • самый низкий из 5 старших символов в string
0
По вопросам рекламы [email protected]