題目描述
在活動大促中,有玩遊戲瓜分獎金環節。現有獎金池為3000元,代表獎金池中的初始額度。使用者的分數資訊如下:
uid,score 1001,45 1002,40 1003,35 1004,30 1005,25
表中的資料代表每一個使用者和其對應的得分,user_id和score都不會有重複值。瓜分獎金的規則如下:按照score從高到低依次瓜分,每個人都能分走當前獎金池裡面剩餘獎金的一半,當獎金池裡面剩餘的獎金少於500時(不含),則停止瓜分獎金。
解題思路:這是拼多多的一個面試題,需要先進行一點數學層面的分析,把整個瓜分邏輯捋清楚之後不難。這裡給出一種思考邏輯:假設獎金池的初始總獎金為n,那麼第一名分到的獎金為n/2,第二名分到獎金n/4,第三名分到的獎金為n/8,依次類推第x名分到的獎金為n/2^x,然後計算即可。
資料準備
CREATE TABLE temp_score_1120 ( uid int, score int ) stored as orc tblproperties ('orc.compress' = 'snappy'); insert into temp_score_1120 select 1001, 45 union all select 1002, 40 union all select 1003, 35 union all select 1004, 30 union all select 1005, 25;
參考實現
select uid , score , 1 / power(2, rn) * 3000 as prize from (select uid , score , row_number() over (order by score desc) as rn from temp_score_1120) t1 where 1 / power(2, rn) * 3000 >= 250;