选择题
- 关于主成分分析说法错误的是
PCA可以用来降维处理
PCA可以通过SVD来实现
PCA实现线性组合最大化样本方差
PCA可以通过特征值分解来实现
- 2个盒子被小牛分别放入中有两个大小相同的球,这两个球只可能是红和蓝两种颜色,并且一个球是红的还是蓝的是等可能的。小牛让小客来猜盒子里球的颜色分别是什么样颜色。在小客猜的过程中,小牛告诉小客其中一个是盒子里面是红色的小球,那么另一个盒子里球还是红色的概率是多少
题解:
总共4种情况:红红、红蓝、蓝红、蓝蓝
现在已知一个是红色 排除最后一种 还有一个是红的概率是 1/3
- 若 f ′ ( e x ) = x e − x , f ( 1 ) = 1 f'(e^x) = xe^{-x},f(1)=1 f′(ex)=xe−x,f(1)=1,那么 f ( e ) = ? f(e)=? f(e)=?
令 y = e x , x = l n y y = e^x , x = lny y=ex,x=lny ,则$ f’(y) = lny * y^{-1}$
通过交换 可得$f(y) = 1/2 * (lny)^2 + c $
把f(1) = 1带入 c = 1
$f(e) = 1/2 +1 = 1.5 $
- 数据结构中,沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( 后)序的遍历实现编号。
先序 根左右
中序 左根右
后序 左右根
- 现在假设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有( n+1 )个?
简单画图可知
根据森林转换为二叉树的“左孩子右兄弟”的表示法,即对于每棵二叉树,每个结点的右指针指向其右邻兄弟。
针对每一个非终端结点,一定会有且仅有一个孩子结点没有右邻兄弟,即右指针领域为空。因此N个非终端结点,就有N个右指针域为空。
看完单棵二叉树,再来看这些二叉树是怎么连接成一棵二叉树的。原理是:将后一棵二叉树的根节点作为前一棵二叉树的右孩子连接起来,所以只有最后一棵二叉树的根结点没有右孩子,即右指针域为空。
因此综上:N个非终端结点,就有(N+1)个结点的右指针域为空。
-
现在假设对N个元素的链表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( (N+1)/2)?
-
完全二叉树是指深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一 一对应将一棵有50个结点的完全二叉树按节点编号,如根节点的编号为1,那么编号为25的结点是( 有左孩子,无右孩子)?
完全二叉树,而且与深度为K的满二叉树中编号从1至n的结点一 一对应,说明满足每层从左到右都是按编号顺序排列的,根节点的编号为1,对于编号为n的结点,其左孩子编号为2n , 右孩子编号为2n+1。当根节点编号为0时,左孩子编号为2n+1,右孩子为2n+2,父节点为(n-1)/2
- 假设有选课表course_relation(student_id, course_id),其中student_id表示学号,course_id表示课程编号,如果小易现在想获取每个学生所选课程的个数信息,请问如下的sql语句正确的是( )
select student_id, count(course_id) from course_relation group by student_id;
- 城市A当前剩余的车牌号为70000-99999之间,假设不能有两个相同的数字,那么剩余车牌号有(9072 )个.
3 * 9 * 8 * 7 * 6 = 9072
第一位有7、8、9 三种选择,第二位有9种选择 ,以此类推
10.15个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?(987)
斐波那契数列 1、2、3、5、8、13、21、34、55、89、144、233、377、610、987
简答题
用户分析是电商数据分析中重要的模块,在对用户特征深度理解和用户需求充分挖掘基础上,进行全生命周期的运营管理(拉新—>活跃—>留存—>价值提升—>忠诚),请尝试回答以下3个问题:
-
现在数据库中有一张用户交易表order,其中有userid(用户ID)、orderid(订单ID)、amount(订单金额)、paytime(支付时间),请写出对应的SQL语句,查出每个月的新客数(新客指在严选首次支付的用户),当月有复购的新客数,新客当月复购率(公式=当月有复购的新客数/月总新客数)
create view t1 as select userid,strftime('%Y-%m',min(paytime)) as year_month from order group by userid -- 每个月新客数 select t1.year_month,count(t1.userid) as '每月新客数' from t1 group by t1.year_month -- 当月有复购的新客数 select t2.year_month,count(t2.nums) as '复购的新客数' from ( select t1.year_month,count(o1.userid) as nums from t1 inner join order o1 on o1.userid = t1.userid and strftime('%Y-%m',o1.paytime) = t1.year_month group by o1.userid having count(o1.userid) > 1 ) as t2 group by t2.year_month -- 新客当月复购率 select a.year_month, a.每月新客数, b.复购的新客数, 1.0*b.复购的新客数/a.每月新客数 as '当月复购率' from ( select t1.year_month,count(t1.userid) as '每月新客数' from t1 group by t1.year_month ) as a ( select t2.year_month,count(t2.nums) as '复购的新客数' from ( select t1.year_month,count(o1.userid) as nums from t1,order o1 where o1.userid = t1.userid and strftime('%Y-%m',o1.paytime) = t1.year_month group by o1.userid having count(o1.userid) > 1 )as t2 group by t2.year_month ) as b where a.year_month=b.year_month order by a.year_month
- 当你发现最近一周APP端新访用户当天转化率(公式=新访当天支付人数/新访用户数,新访是指首次访问严选APP的设备)环比最近4周日均转化率大幅下跌(超30%),你会如何去探查背后的原因?请描述你的思路和其中涉及的关键指标
环比:2020.11 和 2020.12
同比:2019.12 和 2020.12
由于最近一周APP新访用户当天转化率都大幅下跌,所以可以排除偶然事件的影响,判定是产品侧出了问题需要改进。
- 根据转化率公式=新访当天支付人数/新访用户数,
-
首先判断是不是在新访用户数不变的基础上、新访当天支付人数减少了?
- 是哪些人群的支付人数减少了?
- 这些人是否存在渠道的差异?
- 哪个渠道的人群转化率降低了?
- 是不是这个渠道的素材出了问题?
- 是不是产品策略最近有改变导致这个人群下单需求降低?
- 可以通过查看分渠道新访用户数和转化率进行判断。
-
然后继续判断,是不是新访用户数增多,但当天支付人数没有增多。
- 新访用户数增多是所有渠道都增多还是个别渠道增多?
- 如果是个别渠道新访客增多,那说明产品前期运营做的不错,对用户是有一定吸引力的。但为什么选择下单的用户少?
- 是具体哪个功能模块出了问题?
- 是相关推荐的算法不够精确还是购物车的设计不够方便支付?
- 可以查看各渠道的新访用户数,当天支付用户数,各渠道的用户对各功能的使用情况来排查有问题的部分。
-
在进行用户运营之前,我们通常会对用户进行分层,针对不同类型用户实施差异化的运营策略和资源投入,请你帮助设计严选用户分层的方案,包括关键特征的选择,分层的方法,如涉及模型/算法,请说明选择的算法类型、基本原理和步骤
用户分层指的是根据用户不同的消费倾向与消费偏好,针对性的提供营销和服务,以极化用户价值。这里用户分层的具体业务目标是,便于进行全生命周期的运营管理(拉新、活跃、留存、价值提升、忠诚)
为了便于进行运营管理,根据全生命周期的几个阶段进行用户分层,以便对每个阶段的用户实施差异化的策略,将其向下个阶段转化。可以看到每个阶段都是对用户购物行为的一种描述,那么根据用户的购物模式来分层。根据用户的消费金额、最近消费频率、最近活跃天数、最近活跃行为等关键特征分为以下几层:
- 客单>=500 且 最近七天有活跃(高质量用户,防流失)
- 近30天购买频次 >=3 且 近7天未访问(活跃用户,提高留存)
- 近7天访问频次 >=5 且 近7天未购买(需要价值提升)
- 七天内注册用户且无下单购买(新用户需要开单)
- 客单≥500且近7天未访问(提高活跃度)
c.由于消费金额/频率/活跃天数这些都是连续型数据,且数据量较大,所以用Kmeans聚类算法。
基本原理和步骤略
网易严选是网易旗下原创生活类自营电商品牌,深度贯彻“好的生活,没那么贵”的品牌理念。商品覆盖居家、餐厨、配件、服装、洗护、母婴、原生态饮食等几大类目,兼具品质和性价比,得到用户的广泛好评。若你是网易严选负责商品的数据分析师,当面对以下业务问题时,你会如何解决?
- 居家品类期望了解购买居家类目的用户是哪群人,期望你帮助她进行品类用户画像的构建,以作为居家品类规划和商品运营的参考,你会从哪些维度去完成类目用户的刻画?
- 构建居家品类用户画像的目的是,了解这类用户的特征进而了解他们的需求,从而作为参考帮助运营给用户提供区别化的对待、个性化的服务,达到提升用户购物体验进而提升平台流水的效果。
- 要具体的刻画购买居家品类的用户,要从和居家有关系的方面入手,涵盖尽可能多的方面。根据以上具体业务目标,我选用以下维度描述购买居家类目的用户:
- 自然属性 年龄,性别;
- 社会属性 职业,住在哪里,婚恋状况,教育程度;
- 兴趣属性 喜欢进行的活动,花费时间最多的工作之外的活动,是否养宠物
- 消费属性 消费频次,消费额,最喜欢购买哪个品牌的居家类商品,购买次数最多的居家类商品是什么。
- 如果需要选择一批商品来吸引新用户,你会从哪些维度进行选择?请写出维度,选择的原因,对应的指标
从商品品类维度选,各种品类的商品都挑选,显示出网易严选商品的齐全、种类多。涉及到的指标有,覆盖到的商品类目有多少、商品类目有哪些。
从商品品质维度选,显示出网易严选定位的一大特点:品质优,这对于商品来说是一个硬核项。要直观的表示商品品质不太容易,可以利用品牌效应,选大牌商品,列举出网易严选平台上有多少垂直领域里的大牌,突出平台的定位。涉及到的指标有:网易严选有多少大牌/专业品牌,具体到每个领域的大牌有哪些
从商品性价比维度选,显示出网易严选定位的另一大特点:性价比高。涉及到的指标有:优质商品在网易严选的定价和在其他平台的定价对比
从商品好评率维度选,选好评率最高的,让用户的赞扬声感染更多的用户。涉及到的指标有:商品评价里好评个数/评价总数
编程题
小易给定你数字A、B(A < B)和系数p,q。每次操作你可以A将变成A+p或者将p变成p*q。问至少几次操作使得B<=A。
输入描述:
第一行数据组数T,对于每组数据,一行四个整数A,B,p,q。
1<=A,p,B<=10^9,2<=q<=10,1<=T<=5
输出描述:
对于每组数据,输出一个数字表示答案
示例1
输入
2
1 5 7 2
3 5 1 2
输出
1
2
示例2
输入
2
1 15 4 2
12 19 3 2
输出
3
3
#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;cin>>n;
while(n--){
int a,b,p,q;
cin>>a>>b>>p>>q;
if(b-a<=p)
cout<<1<<endl;
else{
int ans = (b-a)/p;
if(ans * p != b-a)
ans++;
int res = log(ans)/log(q);
if(log(q) * res != log(ans))
res++;
cout<<res+1<<endl;
}
}
return 0;
}
有三种葡萄,每种分别有a,b,c颗。有三个人,第一个人只吃第种1、2葡萄,第二个人只吃第2、3种葡萄,
第三个人只吃第1、3种葡萄。适当安排三个人使得吃完所有的葡萄,并且且三个人中吃的最多的那个人吃得尽量少。
输入描述:
第一行数字T,表示数据组数。
接下来T行,每行三个数a,b,c
1<=a,b,c<=10^18,1<=T<=10
输出描述:
对于每组数据,输出一行一个数字表示三个人中吃的最多的那个人吃的数量。
示例1
输入
2
1 2 3
1 2 6
输出
2
3
示例2
输入
1
12 13 11
输出
12
题解:
1. 把这三种葡萄数量 看成三角形的三条边
2. 如果这些数量构成 三角形 每个人吃相邻两边 也就是均分所有葡萄 这里要的是最大值 所以记得处理小数
3. 如果不能构成 三角形 且两短边之和大于等于长边的一半,也可实现总数平分;
4. 反之,则结果为长边的一半 说明有一种葡萄的数量大于 其他两种数量之和 那种葡萄两个人平分 所以最大的是
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long nums[3];
int n;
cin>>n;
while(n--){
long sumnums = 0;
for(int i = 0;i < 3;i++){
cin>>nums[i];
sumnums += nums[i];
}
sort(nums,nums+3);
//特殊处理下小数
cout<<max((sumnums+2)/3,(nums[2]+1)/2)<<endl;
}
return 0;
}
小易定义一个数字序列是完美的,即每个数字都要大于等于前面所有数字的和。现在给定数字序列A
小易想请你从中找出最长的一段连续子序列,满足它是完美的。
输入描述:
第一行数据组数T。对于每组数据,第一行一个整数n,接下来一行n个整数表示序列。
1<=n<=10^5
输出描述:
对于每组数据,一行一个数字表示最长完美的连续子序列的长度。
示例1
输入
2
5
1 3 9 2 6
5
4 2 9 16 7
输出
3
3
题解:
1.双指针滑动窗口
2.设置起点,遍历数组,如果当前符合完美数组,加入并更新
3.否则重新建立 ,更新
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n;
while(n--) {
cin >> m;
int nums[m];
int start = 1;
int ans = 0;
for(int i = 0; i < m; i++)
cin >> nums[i];
int sum = nums[0];
for(int i = 1; i < m; i++) {
if(sum <= nums[i]) {
sum += nums[i];
ans = max(ans, i - start + 1);
}else {
start = i;
sum = nums[i];
}
}
cout << ans << endl;
}
return 0;
}
小易的公司一共有n名员工, 第i个人每个月的薪酬是xi万元。
现在小易的老板向小易提了m次询问, 每次询问老板都会给出一个整数k, 小易要快速回答老板工资等于k的员工的数量。
输入描述:
第一行,两个空格间隔的整数n和m,表示人数和提问的次数
第二行,n个用空格间隔的整数xi,表示每名员工的薪酬
接下来有mm行,每行一个整数,表示老板的一次提问。
1<=m<=80000 ,1<=n<=100000 ,1<=xi<=500,000,000
输出描述:
m行,每行一个整数,表示对应提问的答案
示例1
输入
7 4
6 2 1 2 6 2 5
6
5
8
2
输出
2
1
0
3
解法:
直接用unordered map 哈希表
#include <stdio.h>
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
unordered_map<int, int> dicts;
for(int i = 0; i< n; i++)
{
int x;cin>>x;
dicts[x]++;
}
int k;
for(int i = 0; i < m; i++ ){
int x;cin>>x;
cout<<dicts[x]<<endl;
}
return 0;
}