9.12-知乎-数仓-笔试
链表重排
偶数一边,奇数一边,直接两次遍历就行
public ArrayList<Integer> getNewLinkedList (int[] linkeds) {
ArrayList<Integer> ans = new ArrayList<Integer>();
for(int i=0;i<linkeds.length;i++){
if(linkeds[i]%2==0){
ans.add(linkeds[i]);
}
}
for(int i=0;i<linkeds.length;i++){
if(linkeds[i]%2==1){
ans.add(linkeds[i]);
}
}
return ans;
}
计算连续两次回答的最大时间窗口级平均回答质量
最大时间窗口还好求,平均回答质量题目中完全没有给指标的描述,一直没折腾出来。做完后,有佬说这是原题,搜了一下还真是。。。https://www.nowcoder.com/practice/9dcc0eebb8394e79ada1d4d4e979d73c?tpId=240&&tqId=39189
select user_id,
days_window as max_interval_day,
round(days_window*cnt/dif_days,2) as avg_score_cnt
from(
select
user_id,
count(start_time) as cnt,
datediff (max(start_time), min(start_time)) + 1 as dif_days,
max(datediff (next_start_time, start_time)) + 1 as days_window
from
(
select
user_id,
question_id,
start_time,
lead (start_time) over (
partition by
user_id
order by
start_time
) as next_start_time
from
answer_score_tb
where
year (start_time) = 2023
)as t1
group by user_id
)t2
where dif_days>1 --至少有两天
order by days_window desc,avg_score_cnt desc;
计算每个房间当天达到最大人数时的数量和当时的时间戳
最多同时在线的变种题
select t1.room_id,
t1.cnt as max_num,
from_unixtime(t2.action_time) as action_time
from (
--各房间最大同时在线人数
select room_id,
max(cnt) as cnt
from tmp
group by room_id
) t1 --要当时的时间戳 只能left join上
left join(
select *
from tmp
) t2 on t1.room_id = t2.room_id and t1.cnt = t2.cnt
with tmp as (
-- 与 同时在线人数 相同的处理方法
select room_id,
user_id,
sum(tag) over (
partition by room_id
order by action_time
) as cnt,
action_time
from (
select *,
1 as tag
from room_user_action_log
where action = 'enter'
union all
select *,
-1 as tag
from room_user_action_log
where action = 'quit'
) t1
)t2
