今天进行了腾讯音乐的数据工程海笔,一个都没写出来真的臊得慌。趁着还记得来进行一下简单的复盘。

首先数据工程和前后端的试题都不同,前后端是3+1,三个算法+一个结构性思维题;数据工程是2+1+2,两个SQL题+一个算法题+两个组件的结构性思维题。两个SQL其实比较简单,但是我SQL并没有想象中的熟练,且听说ac机有点点怪(这不是主要原因),所以没有写出来。题目不太好描述,所以后续搜集到了题目会进行更新。算法是个dfs算法,我算法也不强,想到了递归、想到了指针但是没想到dfs,真该死。。。

两个组件的题也是,简单描述下就是:

  • 手写Kafka消费者工程代码,写一个固定格式的5分钟定时消费的代码
  • flume
    • 维护一个实时排序用什么算法?手写关键代码
    • 遇到海量数据时flume背压了,可能的情况和解决方案?
    • 结合存储和性能给出的调优、选择方案

很遗憾,我这两个组件的面经都没背,甚至于flume都没有学,所以最后半小时在那一个字都憋不出。下面就对这个算法进行简单复盘。

算法

给定一个字符串和一个字符串数组,输出所有能用字符串数组拼接成字符串的情况。数组中的字符串可重复使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例1:
输入:String s = "nowcoder"; String[] arr = {"now", "coder", "no", "wcoder"};
输出:{"now coder", "no wcoder"}

例2:
输入:String s = "nownowcoder"; String[] arr = {"now", "coder", "no", "wcoder"};
输出:{"now now coder", "now no wcoder"}

例3:
输入:String s = "nowcoder"; String[] arr = {"nowcoder"};
输出:{"nowcoder"}

例4:
输入:String s = "nowcoder"; String[] arr = {"now", "wcoder"};
输出:{}

为了显著提高我自己的技术,以后的算法笔记采用双版本进行书写。

Java版本:

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
import java.util.*;

public class Main {
public static void main(String[] args) {
Solution s = new Solution();
String s1 = "nowcoder";
String[] s2 = {"now", "coder", "no", "wcoder"};
String[] s3 = s.maxIn(s1, s2);
for (int i = 0; i < s3.length; i++) {
System.out.println(s3[i]);
}

}
}

class Solution {
List<String> res = new ArrayList<>();
String a;
String[] ss;
public String[] maxIn(String s, String[] arr) {
a = s;
ss = arr;
dfs(0, "");
return res.toArray(new String[res.size()]);
}

public void dfs(int parm, String s) {
if (parm >= a.length()) res.add(s);
if (parm < a.length()) {
for(int i = 0; i < ss.length; i++) {
int len = parm + ss[i].length();
if(len <= a.length() && a.substring(parm, len).equals(ss[i])){
if(parm == 0) dfs(len, ss[i]);
else dfs(len, s + " " + ss[i]);
}
}
}
}
}

Scala版本:

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
import scala.collection.mutable.ArrayBuffer

object Main {
def main(args: Array[String]): Unit = {
val s: Solution = new Solution
val s1: String = "nownowcoder"
val s2: Array[String] = Array("now", "coder", "no", "wcoder")
val s3: Array[String] = s.maxIn(s1, s2)
for (i <- s3.indices) {
println(s3(i))
}
}
}

class Solution {
private val res = ArrayBuffer[String]()
private var a: String = null
private var ss: Array[String] = null

def maxIn(s: String, arr: Array[String]): Array[String] = {
a = s
ss = arr
dfs(0, "")
res.toArray
}

private def dfs(param: Int, s: String): Unit = {
if (param >= a.length) res += s
else if (param < a.length) for (i <- ss.indices) {
val len: Int = param + ss(i).length
if (len <= a.length && a.substring(param, len) == ss(i)) {
if (param == 0) dfs(len, ss(i))
else dfs(len, s + " " + ss(i))
}
}
}
}

友人提供的C++版本

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
50
51
52
53
54
55
#include <iostream>
#include <vector>

using namespace std;

string s;
int n;
vector <string> v;
vector <vector<string>> ans;
int st[30];
int len;

void getAns() {
vector <string> vi;
for (int i = 0; i < len; i++) {
vi.push_back(v[st[i]]);
}
ans.push_back(vi);
}

void dfs(int p) {
if (p == s.size()) {
getAns();
return;
}
for (int i = 0; i < n; i++) {
int pi = p;
int si = 0;
while (pi < s.size() && si < v[i].size() && s[pi] == v[i][si]) {
pi++;
si++;
}
if (si >= v[i].size()) {
st[len++] = i;
dfs(pi);
len--;
}
}
}

int main() {
cin >> s;
cin >> n;
v.resize(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
dfs(0);
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[i].size(); j++) {
cout << ans[i][j] << " ";
}
cout << endl;
}
}