字节--用户喜好
字節–用戶喜好
文章目錄
- 字節--用戶喜好
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
為了不斷優化推薦效果,今日頭條每天要存儲和處理海量數據。假設有這樣一種場景:我們對用戶按照它們的注冊時間先后來標號,對于一類文章,每個用戶都有不同的喜好值,我們會想知道某一段時間內注冊的用戶(標號相連的一批用戶)中,有多少用戶對這類文章喜好值為k。因為一些特殊的原因,不會出現一個查詢的用戶區間完全覆蓋另一個查詢的用戶區間(不存在L1<=L2<=R2<=R1)。
- 輸入描述:
- 輸出描述:
二、分析
哎,字節爸爸的題永遠不要想的太簡單,題中已經說到—海量數據,暴力求解只能超時,所以需要另辟捷徑
- 這道題我們可以把用戶的喜好值和用戶的id封裝在一起,Node
- Node中一個是喜好值val,一個是index當前索引
- 則輸入數組設置為:vector<node>vec,然后按照val對vec進行排序,這樣就會把同一個val的相鄰。
- 然后用一個map記錄每個不同的val的初始索引,當查詢一個val的時候,只需要根據map中val的初始索引,在vec中向后查找,統計index在給定的left值和right范圍內的個數即可,這么做為了避免每次查詢一個val,就會遍歷很多數
三、代碼
#include<iostream> #include<vector> #include<unordered_map> #include<algorithm>using namespace std; //封裝Node typedef struct __tagNode {int val;//用戶喜好值int index;//用戶下標__tagNode(int x, int y){val = x;index = y;} }Node;//自定義比較方式:以用戶的喜好值排序 class less_to_greater {public:bool operator()(Node &x, Node &y){return x.val < y.val;} };int main() {int n;cin >> n;vector<Node>vec(n, Node(0, 0));//構造數組for(int i = 0; i < n; ++i){cin >> vec[i].val;vec[i].index = i;}// 排序sort(vec.begin(), vec.end(), less_to_greater());// 記錄每個喜好對應索引的位置//如果存在多個相同的喜好值,以第一個為準unordered_map<int, int>ma;for(int i = 0; i < n; ++i){if(ma.count(vec[i].val) < 1)ma[vec[i].val] = i;}// 開始查詢int q;cin >> q;while(q){int l, r, k;cin >> l >> r >> k;//排除不合法情況和沒有k喜好值的情況if(l > r || ma.count(k) < 1){cout << 0 << endl;--q;continue;}//--的原因是房間id是從1開始的--l;--r;//獲取喜好值為k的索引位置int i = ma[k];//保存結果int res = 0;//因為可能不只i號用戶的喜好值為k,上面保存的時候只以第一個為準//如果i位置在l和r之間更新結果while(i < n && vec[i].val == k){if(vec[i].index >= l && vec[i].index <= r)++res;++i;}cout << res << endl;--q;}return 0; }總結