今天微信支付一面,在线面试。
在collabedit上面进行的,一开始面试官给我打了个电话,说在collabedit上面出好了题目,让做完之后给他回个短信。然后没有多余的废话,就上了collabedit开始做题了。
两个题目,二选一
第一题:在一个二叉树中找到所有节点的内容包含某子串的节点,并使用快速排序方法找到顺序为第n位的节点值。排序规则如下:子串出现的次数,如果次数一样则按字符数排序,如果字符数一样则按ascii排序。
第二题:一个公司有很多员工,也有主管,每天员工和主管都需要签到,但主管可以用签到机确认有多少人上班,也可以按员工ID顺序或签到顺序打印出上班的员工,还可以找出倒数第n个上班的员工是谁。
要求:
请用OO的方法分析和实现
所有操作的时间消耗和空间消耗越低越好,其中排序算法时间复杂度不能超过O(nlogn),极端情况下也不可以退化为n^2
考虑到第二题还得设计什么的,直接选了更为直接的第一题-算法题。
第一题给了TreeNode的定义和函数接口
truct TreeNode { char* value; struct TreeNode * left, * right; }; struct TreeNode * findNode(struct TreeNode * head,char * substr, int n) { //to do }
其实这个题考查的还是挺多的,字符串匹配(KMP),树的遍历(前中后),前k大元素(堆,快排思想),其实在线面试最看重的是代码风格,然后是思路,最后只要保证人眼bug free就好了。
下面是我做题时实现的代码(不保证无bug,因为没跑过)
struct TreeNode { char* value; struct TreeNode * left, * right; }; vector<pair<TreeNode*, int>> nodes; struct TreeNode * findNode(struct TreeNode * head,char * substr, int n) { fill_nodes(head, substr); TreeNode* result = quick_find(nodes, 0, nodes.size()-1, n); } TreeNode* quick_find(vector<pair<TreeNode*, int>>& nodes, int left, int right, int n){ if(left == right) return nodes[left].first; pair<TreeNode*, int> tmp = nodes[0]; int r = right, l = left; while(l < r){ while(l < r && is_small(tmp, nodes[r])) r--; if(l < r){ nodes[l] = nodes[r]; l++; } while(l < r && is_small(nodes[l], tmp)) l++; if(l < r){ nodes[r] = nodes[l]; r--; } } nodes[l] = tmp; if(l == n) return nodes[l].first; if(l < n) return quick_find(nodes, l+1, right, n); else return quick(nodes, left, l-1, n); } bool is_small(pair<TreeNode*, int> node_count1, pair<TreeNode*, int> node_count2){ if(node_count1.second < node_count2.second) return true; if(node_count1.second > node_count2.second) return false; int str_len1 = 0, str_len2 = 0; char* str1 = (node_count1.first)->value; char* str2 = (node_count2.first)->value; for(int i = 0; str1[i] != '