中级农民
- 积分
- 188
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-9-17
- 最后登录
- 1970-1-1
|
是真的难。。。
1. Design一个 auto spell-correction: 讨论下来, 面试官想给我一个Collection<String> dictionary 表示字典, 让我设计一个数据结构, 实现一个API : List<String> findKClosest(String word, int k) : 返回字典里所有的距离 word 的 edit distance <= k 的单词, 单词按照edit distance排序, 如果edit distance相同, 按照alphabetical排序
可以Trie + DFS + DP + TreeSet 实现
priority_queue<pair<int,string>, vector<pair<int,string>>, greater<pair<int,string>>> pq = {};
vector<string> findKClosest(string word, int k, vector<string> words){
TrieNode* root;
for(string s:words)
insert(root,s);
TrieNode* p = root;
dfs(word,0,p,0,k);
vector<string> res = {};
while(!pq.empty()){
res.push_back(pq.top().second);
pq.pop();
}
return res;
}
void dfs(string word, int idx, Trie* p, int ED, int k){
if(idx == word.size()){
pq.push({ED,word});
return;
}
// not change
if(p->next[word[idx]-'a'])
dfs(word,idx+1,p->next[word[idx]-'a'],ED,k);
// if change
string tmp = word;
for(int i=0; i<26; ++i){
if(p->next[i] && word[idx]!= (char)('a'+i) && ED+1<=k){
tmp[idx] = (char)('a'+i);
dfs(tmp,idx+1,p->next[tmp[idx]],ED+1,k);
tmp = word;
}
}
}
2. LC 57 + LC 1272 推广: design 一个数据结构, 支持三个api: add(int start, int end), remove(int start, int end), isExist(int start, int end): 能往这个数据结构里add 线段, remove 线段, 可以query某个线段是不是被现在数据结构里include 比如: add(1, 3) add (2, 5) add(7, 9) add(15, 20) 这时候内部有这样的线段 [1, 5] [7, 9] [15, 20], isExist(2,3): true isExist(4, 6) false. 如果remove(4, 8) 内部的线段 [1,3] [9, 9] [15, 20]
715
3. Serialize/Deserialize Binary Tree: 但是面试官说 TreeNode 的 field是String, 可以是任意String. 我本来想用"," 间隔, 但面试官说val就可以是逗号, 并且可以任意Unicode组成的String, 任何我想拿来当分隔符的符号, 都可以是val
TreeNode {
String val;
TreeNode left, right;
}
我想到的可以用转义符解决, "," 表示逗号 "\," 表示分隔符, "\\" 才表示 \
class Codec {
public:
string serialize(TreeNode* root) {
ostringstream out;
serialize(root, out);
return out.str();
}
TreeNode* deserialize(string data) {
istringstream in(data);
return deserialize(in);
}
private:
void serialize(TreeNode* root, ostringstream& out) {
if (root) {
string tmp = root->val;
if(!tmp) out << "_*_" << "_#_";
else if(tmp == "") out << "_%_" << "_#_";
else{
int i = 0;
while(i<tmp.size() && (tmp.find("#") || tmp.find("$") || tmp.find("*") || tmp.find("%") )){
if(tmp[i] == "#") {tmp.replace(i,1,"# #");i+=2;}
else if(tmp[i] == "$") {tmp.replace(i,1,"$ $");i+=2;}
else if(tmp[i] == "*") {tmp.replace(i,1,"* *");i+=2;}
else if(tmp[i] == "%") {tmp.replace(i,1,"% %");i+=2;}
i++;
}
out << tmp << "_#_";
}
serialize(root->left, out);
serialize(root->right, out);
} else {
out << "_$_" << "_#_";
}
}
TreeNode* deserialize(istringstream& in) {
string tmp;
getline(in,tmp,"_#_");
TreeNode* root = nullptr;
if (tmp != "_$_"){
string val = NULL;
if(tmp == "_%_") val = "";
else {
int i = 0;
while(i<tmp.size()-2 && (tmp.find("# #") || tmp.find("$ $") || tmp.find("* *") || tmp.find("% %") )){
if(tmp.substr(i,3) == "# #") tmp.replace(i,3,"#");
else if(tmp.substr(i,3) == "$ $") tmp.replace(i,3,"$");
else if(tmp.substr(i,3) == "* *") tmp.replace(i,3,"*");
else if(tmp.substr(i,3) == "% %") tmp.replace(i,3,"%");
i++;
}
val = tmp;
}
root = new TreeNode(val);
root->left = deserialize(in);
root->right = deserialize(in);
}
return root;
}
};
有一轮面试: 问了一个House Robber(LC 198)的二维推广版, 就是给一个 n x m 2d array, 每个位置代表房子的金额 >= 0, 如果偷了一个房子, 则周围八个房子都不能偷, 问能偷到的最大金额是多少?
X 1349 |
|