zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【数据挖掘】滴滴公司数据挖掘工程师笔试题

公司工程师 笔试 数据挖掘 滴滴
2023-09-14 09:13:06 时间

1 选择题

1、Lm19980107【单选】下面哪种算法会导致信息不可还原?C
A、RSA
B、DES
C、SHA1
D、LZ77

SHA1用于Hash,不可还原。

RSA、DES、LZ77都用于数据加密或压缩,均可还原。

2、下面函数的输出结果是(C)
void func() {
int k = 1^(1 << 31 >> 31);
printf(“%d\n”, k);
}
A、0
B、-1
C、-2
D、1

解析:右移运算左侧补符号位; 补码转源码:补码减1;除符号位全部取反

int
int 为有符号整数,以 32 位存储,因此1的二进制表示为:

00000000` `00000000` `00000000` `00000001

1<<31
将所有数整体向左移31位,溢出的数直接舍去,右侧补0。即:

10000000` `00000000` `00000000` `00000000

()>>31
将所有数整体向右移31位,左侧补符号位数字。即:

11111111` `11111111` `11111111` `11111111

1^()
异或运算,得

11111111` `11111111` `11111111` `11111110

此时符号位为1,代表次数为负数。因为计算机中加减运算使用的都是补码,所以不能直接将补码形式二进制数通过除二取余法转换为十进制数。要先将补码转换为原码,再通过除二取余法转换为十进制数。

负数补码转换为原码步骤:

  1. 补码-1,得反码:

    11111111 11111111 11111111 11111101

  2. 反码除符号位其余位取反,得原码:

    10000000 00000000 00000000 00000010

最后,将原码使用除二取余法转换为十进制数,为-2。

3、下面哪个SQL语句可以查询出“id存在于A表中,但不存在于B表”的数据? B
A、 select A.* from A join B on A.id=B.id where B.id is null;
B、 select A.* from A left outer join B on A.id=B.id where B.id is null;
C、 select A.* from A right outer join B on A.id=B.id where B.id is null;
D、 select A.* from A inner join B on A.id=B.id where B.id is null;

4、已知一棵二叉树,如果先序遍历的节点顺序是:ADCEFGHB,中序遍历是:CDFEGHAB,则后序遍历结果为()D
A、 CFHGEBDA
B、 CDFEGHBA
C、 FGHCDEBA
D、CFHGEDBA

5、在64位操作系统上,下面程序返回什么结果:D

int main() {
    int *k[10][30];
    printf(""%d\n"", sizeof(k));
    return 0;
}

A、 4
B、 8
C、 1200
D、 2400

解析:int k,表示的是指针数组,一共有1030=300个元素。在64位系统下,每个指针的长度是8字节,因此总长度为2400字节

6、以下哪些方法不适合用来对特征分布进行分析?D
A、 PCA
B、IsoMap
C、 LLE
D、 KNN

解析:PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,是一种用于探索高维数据结构的技术,主要用于对数据的降维,通过降维可以发现更便于人理解的特征,加快对样本有价值信息的处理速度,此外还可以应用于可视化(降到二维)和去噪。

Isomap(Isometric Feature Mapping)是流行学习的一种,用于非线性数据降维,是一种无监督算法。

LLE(Locally Linear Embedding)算法,即局部线性嵌入算法。 该算法是针对非线性信号特征矢量维数的优化方法,这种维数优化并不是仅仅在数量上简单的约简,而是在保持原始数据性质不变的情况下,将高维空间的信号映射到低维空间上,即特征值的二次提取 。

7、以下不属于优化求解方法的是?C
A、 L-BFGS
B、 SGD
C、 ReLu
D、模拟退火

解析:L-BFGS是解无约束非线性规划问题最常用的方法,具有收敛速度快、内存开销少等优点,在机器学习各类算法中常有它的身影。 简单的说,L-BFGS和梯度下降、SGD干的同样的事情,但大多数情况下收敛速度更快,这点在大规模计算中很重要。

8、ROC曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。对于模型的 ROC 曲线,与哪一点越接近,表明该分类器的性能越好?B
左上,即TPR=0, FPR=1
左上,即FPR=0, TPR=1
右下,即TPR=0, FPR=1
右下,即FPR=0, TPR=1

9、在0到1之间随机选择3个小数,他们的和小于1的概率是?D

A、1/2
B、1/3
C、1/4
D、1/6

解析:设所取的三个数分别为 x、y、z ,
则 0<x<1,0<y<1,0<z<1 ,
满足上述条件的点 P(x,y,z)构成一个棱长为 1 的正方体,体积为 V=111=1 ,
满足 x+y+z=1 的点是分别过(1,0,0)、(0,1,0)、(0,0,1)的平面,
而满足 x+y+z<1 的点位于正方体内、平面的下方,体积为 V1=1/31/2111=1/6 ,

10、在以下不同的场景中,使用的分析方法不正确的,B
A、 根据司机最近一年的服务订单数据,用聚类算法判断出滴滴司机在不同产品线下所属的司机层级
B、 根据司机近期的订单数据,用聚类算法拟合出乘客未来可能的乘车花费价格公式
C、 用关联规则算法分析出乘坐快车的乘客,是否适合推荐乘坐专车
D、 根据乘客最近的乘车信息,用决策树算法识别出乘客可能是男还是女

解析:B选项,预测消费需要用回归模型来做。而不是聚类算法。

11、用 0,1,2,3,4,5组成没有重复数字的四位数,其中千位数字大于百位数字,且百位数字大于十位数字的四位数的个数是?B
A、 36
B、 60
C、 72
D、 300

解析:前面三位数选出顺序是固定的, 共有C(3,6),最后一位任意选 即C(3,6)*C(1,3)=60

12、有10层台阶,小明每次可以爬一台阶或者两台阶,请问,爬到10层台阶,小明一共有(A)种爬法?
A、 89
B、 90
C、 91
D、 92

解析:斐波拉契数列,dp[n] = dp[n - 1] + dp[n - 2]

dp[1] = 1, dp[2] = 2

dp[3] = dp[1] + dp[2] = 1 + 2 = 3

dp[4] = 3 + 2 = 5

dp[5] = 5 + 3 = 8

dp[6] = 8 + 5 = 13

dp[7] = 13 + 8 = 21

dp[8] = 21 + 13 = 34

dp[9] = 34 + 21 = 55

dp[10] = 55 + 34 = 89

13、两人约会,约好6点到7点之间在指定地点见面,两人都会在6点到7点之间随机选择一个时间点到达约定地点,如果到了之后等15分钟还没见到对方,就会立即走掉,那么哪个描述是对的?B
A、 这俩人能见到面的概率更大
B、 这俩人不能见到面的概率更大
C、能见面和不能见面出现概率相同
D、 无法计算出准确概率

解析:通过画图,可以 求解出相遇的概率为7/16

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OeVH7PcK-1659848927094)(/home/mgege007/Desktop/13.png)]

14、某海岛城市的主要产业为旅游业,之前已经运营了M个景点,现在扩大运营新增了N(>1)个景点,为了方便游客通行任意两个景点都开通了直通巴士(在两个景点间往返),此次新增景点共新开通了58趟直通巴士,请问这个海岛城市总共运营了多少个景点?D
A、 14
B、 15
C、 16
D、 17

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTnT2IKO-1659848927095)(/home/mgege007/Desktop/14.png)]

15、假如有1500盏灯,它们的开关按1-1500进行编号,一开始都是亮着的,我们按照如下步骤操作:C

  1. 切换编号为2的倍数的开关
  2. 切换编号为5的倍数的开关
  3. 切换编号为7的倍数的开关
    最终还有多少盏灯亮着?
    A、 236
    B、 514
    C、 750
    D、 535

解析:

  1. 切换编号为2的倍数的开关
    1500/2=750个灯是亮的,750个灯是灭的
  2. 切换编号为5的倍数的开关
    在5的倍数中,并且是2的倍数的的灯又灭变成了亮,数量为1500/10=150个灯重新亮起来
    在5的倍数中,不是2的倍数的的灯灭了,数量也为150个
  3. 切换编号为7的倍数的开关
    是7倍数是5的倍数,不是2倍数的灯变亮了,数量为1500/35-1500/70=21
    是7倍数是5的倍数是2的倍数的灯变灭了,数量为1500/70=21

所以亮的灯为750个

16、北之于东南,正如西南之于:D
A、 东
B、南
C、 西
D、 北

17、找规律填数:10, 17, 26, 37, ?C

46
52
50
56

解析:

17-10=7

26-17= 9

37-26 =11

50-37 = 13

18、有15瓶一样的可乐,其中有一瓶变质了, 喝了一口之后2小时会闹肚子。最少需要多少只小白鼠做实验,才能在2小时时间内找到有变质的一瓶?
A、 7
B、6
C、 5
D、 4

15瓶可以转换为24种组合,即用4只小白鼠的闹肚子状态表示

可乐序号 闹肚子状态 闹肚子小白鼠编号

1 0 0 0 1 1

2 0 0 1 0 2

3 0 0 1 1 1 2

4 0 1 0 0 3

5 0 1 0 1 1 3

6 0 1 1 0 2 3

7 0 1 1 1 1 2 3

8 1 0 0 0 4

9 1 0 0 1 1 4

10 1 0 1 0 2 4

11 1 0 1 1 1 2 4

12 1 1 0 0 3 4

13 1 1 0 1 1 3 4

14 1 1 1 0 2 3 4

15 1 1 1 1 1 2 3 4

给1号小白鼠喝1 3 5 7 9 11 13 15号可乐的混合

给2号小白鼠喝2 3 6 7 10 11 14 15号可乐的混合

给3号小白鼠喝4 5 6 7 12 13 14 15号可乐的混合

给4号小白鼠喝8 9 10 11 12 13 14 15号可乐的混合

如果1号小白鼠闹肚子 则只可能是1号可乐变质

如果1 2 3号小白鼠都闹肚子而4号没有 则只可能是7号可乐变质

以此类推

2^4=16>15,所以最少4只

19、在某一个国家,由于战争导致民不聊生,贫民纷纷逃难。在逃亡的路上,难民A由于食物全部吃完,濒临饿死,就在这时正好有两个好心难民B和C路过,他们决定帮助这位可怜人;当时B带有4个烧饼,C带有5个烧饼,最后他们三人分吃了所有食物。由于他们的救济,最后A获救了。一年后,A飞黄腾达了,为了感激当年的两位救助他的人,他一共拿出9个金元宝赏报答给B和C。对于9个金元宝的分配给B和C,你觉的合理的分配应该是:C
A、 B拿1个金元宝,C拿8个金元宝
B、 B拿2个金元宝,C拿7个金元宝
C、 B拿3个金元宝,C拿6个金元宝
D、 B拿4个金元宝,C拿5个金元宝

B拿出了4个饼,C拿出了5个饼,因为是他们三个人分吃的食物,也就是说一共是9个饼,三个人分,平均每个人就是3个,而A分到的3个饼是从B那里出了1个,C拿出了2个,凑到了3个饼,也就是说,B出了1/3,C出了2/3,所以就是B=1/39=3,C=2/39=6

20、0,5,27,119,495,2015,(A )
A、 8127
B、 100005
C、 10075
D、 11075

解析:

5=3²-2²
27=6²-3²
119=12²-5²
495=24²-9²
2015=48²-17²
所以8127=96²-33²
逻辑:3 6 12 24 48 96 后者是前者两倍
2 3 5 9 17 33 后者=前者*2-1
故答案选择A

2 编程题

1、我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明:
1 是丑数。
n 不超过1690。

解析:三个位置分别尝试使用一次乘2机会,乘3机会,乘5机会,看看哪个最小,最小的那个就是下一个丑数。最后,那个得到下一个丑数的指针位置加一,因为它对应的那次乘法使用完了。

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[1] = 1
        p2= p3 = p5 = 1
        for i in range(2,n+1):
            num2,num3,num5 = dp[p2]*2,dp[p3]*3,dp[p5]*5
            dp[i] = min(num2,num3,num5)
            if dp[i] == num2:
                p2 +=1
            if dp[i] == num3:
                p3 +=1
            if dp[i] == num5:
                p5 +=1    
        return dp[n]

2、给出n个数字 a_1,…,a_n,问最多右多少不重叠的非空区间,使得每个区间内数字的xor(异或和)都等于0

解析:

找出最大的k,使得存在k个区间(l(i),r(i)),满足
1<=l(i)<=r(i)<=n (1<=i<=k), r(i)<l(i+1) (1<=i<k),且
a[l(i)] xor a[l(i)+1] xor …. xor a[r(i)] ==0 (1<=i<=k)
例如:
当输入为[3, 0, 2, 2]时,答案为2,存在2个区间[0] 和 [2, 2]满足;
当输入为[2, 2, 0, 2, 2]时,答案为3,[2, 2],[0] 和[2, 2]满足。

a=[3,0,2,2]
num = set([0])
last = 0
ans = 0
for i in a:
    last ^= i
    if last in num: 
        print(last)
        ans += 1
        num = set([0])    #
        last = 0
    else:
        num.add(last)
print(ans)