8月13日快手二面

快手二面。这一面算是到目前为止,我遇到过的最神奇的一面了。

首先自我介绍,然后就面试官针对其中的一个项目(我一共准备了4个项目,面了那么多面试官,所有人都问的我的电商项目,只有这个快手面试官问了我一个安卓项目,让我有点刮目相看)提问了一些问题,我都顺顺利利都回答出来了。这部分大约七八分钟的样子。

然后就开始撸算法了。

第一题,给定一个数组,然后该数组中有一个数字出现的次数超过了一半,请求出这个数字是多少。这个应该算是比较基础的问题了,奈何我没刷过,只是记得怎么做,所以只能磕磕绊绊写出来了。

第二题,给定一个数字,把它转成中文。这个我写了一会,发现自己写的思路有比较多的问题,最后只是和面试官聊了一下思路。下面是我从网上找的答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public static String toNum(String temp) {
String[] units = new String[]{"十", "百", "千", "万", "十", "百", "千", "亿"};

// 中文大写数字数组
String[] numeric = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

// 读文件

String res = "";
// 遍历一行中所有数字
for (int k = -1; temp.length() > 0; k++) {
// 解析最后一位
int j = Integer.parseInt(temp.substring(temp.length() - 1, temp.length()));
String rtemp = numeric[j];

// 数值不是0且不是个位 或者是万位或者是亿位 则去取单位
if (j != 0 && k != -1 || k % 8 == 3 || k % 8 == 7) {
rtemp += units[k % 8];
}

// 拼在之前的前面
res = rtemp + res;

// 去除最后一位
temp = temp.substring(0, temp.length() - 1);
}

// 去除后面连续的零零..
while (res.endsWith(numeric[0])) {
res = res.substring(0, res.lastIndexOf(numeric[0]));
}

// 将零零替换成零
while (res.contains(numeric[0] + numeric[0])) {
res = res.replaceAll(numeric[0] + numeric[0], numeric[0]);
}

// 将 零+某个单位 这样的窜替换成 该单位 去掉单位前面的零
for (int m = 1; m < units.length; m++) {
res = res.replaceAll(numeric[0] + units[m], units[m]);
}

// 将壹十改为十
if (res.startsWith(numeric[1] + units[0])) {
res = res.substring(1);
}

return res;
}

我当时写的思路和上面的有出入。

首先我的总体思路是把整个数字分割成xxxx亿xxxx万xxxx的,也就是三个部分,然后这三个部分就可以统一用一个函数来进行输出,就是输出的时候需要考虑后面的单位,然后因为需要考虑零的问题,所以有不少东西。