日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

字节--用户喜好

發(fā)布時(shí)間:2024/4/11 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节--用户喜好 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

字節(jié)–用戶喜好

文章目錄

  • 字節(jié)--用戶喜好
    • 一、題目描述
    • 二、分析
    • 三、代碼

一、題目描述

為了不斷優(yōu)化推薦效果,今日頭條每天要存儲(chǔ)和處理海量數(shù)據(jù)。假設(shè)有這樣一種場(chǎng)景:我們對(duì)用戶按照它們的注冊(cè)時(shí)間先后來標(biāo)號(hào),對(duì)于一類文章,每個(gè)用戶都有不同的喜好值,我們會(huì)想知道某一段時(shí)間內(nèi)注冊(cè)的用戶(標(biāo)號(hào)相連的一批用戶)中,有多少用戶對(duì)這類文章喜好值為k。因?yàn)橐恍┨厥獾脑?#xff0c;不會(huì)出現(xiàn)一個(gè)查詢的用戶區(qū)間完全覆蓋另一個(gè)查詢的用戶區(qū)間(不存在L1<=L2<=R2<=R1)。

  • 輸入描述:
輸入: 第1行為n代表用戶的個(gè)數(shù) 第2行為n個(gè)整數(shù),第i個(gè)代表用戶標(biāo)號(hào)為i的用戶對(duì) 某類文章的喜好度 第3行為一個(gè)正整數(shù)q代表查詢的組數(shù) 第4行到第(3+q)行,每 行包含3個(gè)整數(shù)l,r,k代表一組查詢,即標(biāo)號(hào)為l<=i<=r的用戶中對(duì)這類文章喜好值 為k的用戶的個(gè)數(shù)。 數(shù)據(jù)范圍n <= 300000,q<=300000 k是整型
  • 輸出描述:
輸出:一共q行,每行一個(gè)整數(shù)代表喜好值為k的用戶的個(gè)數(shù)輸入例子1: 5 1 2 3 3 5 3 1 2 1 2 4 5 3 5 3輸出例子1: 1 0 2例子說明1: 樣例解釋:5個(gè)用戶,喜好值為分別為12335, 第一組詢問對(duì)于標(biāo)號(hào)[1,2]的用戶喜好值為1的用戶的個(gè)數(shù)是1 第二組詢問對(duì)于標(biāo)號(hào)[2,4]的用戶喜好值為5的用戶的個(gè)數(shù)是0 第三組詢問對(duì)于標(biāo)號(hào)[3,5]的用戶喜好值為3的用戶的個(gè)數(shù)是2

二、分析

哎,字節(jié)爸爸的題永遠(yuǎn)不要想的太簡(jiǎn)單,題中已經(jīng)說到—海量數(shù)據(jù),暴力求解只能超時(shí),所以需要另辟捷徑

  • 這道題我們可以把用戶的喜好值和用戶的id封裝在一起,Node
typedef struct __tagNode {int val;int index;__tagNode(int x, int y){val = x;index = y;} }Node;
  • Node中一個(gè)是喜好值val,一個(gè)是index當(dāng)前索引
  • 則輸入數(shù)組設(shè)置為:vector<node>vec,然后按照val對(duì)vec進(jìn)行排序,這樣就會(huì)把同一個(gè)val的相鄰。
class less_to_greater {public:bool operator()(Node &x, Node &y){return x.val < y.val;} };
  • 然后用一個(gè)map記錄每個(gè)不同的val的初始索引,當(dāng)查詢一個(gè)val的時(shí)候,只需要根據(jù)map中val的初始索引,在vec中向后查找,統(tǒng)計(jì)index在給定的left值和right范圍內(nèi)的個(gè)數(shù)即可,這么做為了避免每次查詢一個(gè)val,就會(huì)遍歷很多數(shù)

三、代碼

#include<iostream> #include<vector> #include<unordered_map> #include<algorithm>using namespace std; //封裝Node typedef struct __tagNode {int val;//用戶喜好值int index;//用戶下標(biāo)__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));//構(gòu)造數(shù)組for(int i = 0; i < n; ++i){cin >> vec[i].val;vec[i].index = i;}// 排序sort(vec.begin(), vec.end(), less_to_greater());// 記錄每個(gè)喜好對(duì)應(yīng)索引的位置//如果存在多個(gè)相同的喜好值,以第一個(gè)為準(zhǔn)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];//保存結(jié)果int res = 0;//因?yàn)榭赡懿恢籭號(hào)用戶的喜好值為k,上面保存的時(shí)候只以第一個(gè)為準(zhǔn)//如果i位置在l和r之間更新結(jié)果while(i < n && vec[i].val == k){if(vec[i].index >= l && vec[i].index <= r)++res;++i;}cout << res << endl;--q;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的字节--用户喜好的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。