字節跳動(用戶喜好)


題干:

[編程題] 用戶喜好

時間限制:3秒

空間限制:262144K

 

為了不斷優化推薦效果,今日頭條每天要存儲和處理海量數據。假設有這樣一種場景:我們對用戶按照它們的注冊時間先后來標號,對於一類文章,每個用戶都有不同的喜好值,我們會想知道某一段時間內注冊的用戶(標號相連的一批用戶)中,有多少用戶對這類文章喜好值為k。因為一些特殊的原因,不會出現一個查詢的用戶區間完全覆蓋另一個查詢的用戶區間(不存在L1<=L2<=R2<=R1)。

 

輸入描述:

輸入: 第1行為n代表用戶的個數 第2行為n個整數,第i個代表用戶標號為i的用戶對某類文章的喜好度 第3行為一個正整數q代表查詢的組數;

第4行到第(3+q)行,每行包含3個整數l,r,k代表一組查詢,即標號為l<=i<=r的用戶中對這類文章喜好值為k的用戶的個數。

數據范圍n <= 300000,q<=300000 k是整型

 

輸出描述:

輸出:一共q行,每行一個整數代表喜好值為k的用戶的個數

 

輸入例子1:
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3

輸出例子1:
1
0
2

例子說明1:
樣例解釋:
有5個用戶,喜好值為分別為1、2、3、3、5,
第一組詢問對於標號[1,2]的用戶喜好值為1的用戶的個數是1
第二組詢問對於標號[2,4]的用戶喜好值為5的用戶的個數是0
第三組詢問對於標號[3,5]的用戶喜好值為3的用戶的個數是2
 

開始自己寫的代碼: 

 

 1 n = int(input())
 2 li = [int(i) for i in input().split()]
 3 q = int(input())
 4 lrk = []
 5 for j in range(q):
 6     lrk.append([int(k) for k in input().split()])
 7     
 8 def compute(li, param):
 9     a = 0
10     for p in li:
11         if p == param:
12             a += 1
13     return a
14     
15 for r in lrk:
16     li_a = li[r[0]-1: r[1]]
17     print(compute(li_a, r[2]))
18 
19     

 

這段代碼完全可以實現題目的操作,但是其非常費時費力;所以盡管代碼基本正確無誤,但是根本符合不了“速度”的要求;

 

參看了別人的例子改后的代碼:

 

n = int(input())
li = [int(a) for a in input().split()]
d = {}
for i,v in enumerate(li):
    if v not in d:
        d[v] = [i + 1]
    else:
        d[v].append(i+1)
q = int(input())
for _ in range(q):
    l, r, k = map(int, input().split())
    if k not in d.keys():
        print(0)
    else:
        a = 0
        for j in d[k]:
            if j>=l and j<=r:
                a += 1
        print(a)

 

在進行少量數據的運算中,這兩種實現方法時間上看不出來什么差別;但是,當數據量成千上萬甚至十萬級別的時候,第一種方式顯然運算速度上完全落后於第二種;而且是數倍的差距;

在此,程序就不去解釋,只要稍微看一會,就能看出兩段程序的優劣!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM