2015-08-13 [百度]--实习开发测试工程师--1面
时间:2015-08-13 16:40 ~ 18:20
地点:北京市海淀区西北旺东路10号院 百度科技园1号楼
1. 问简历
。。。
2. 算法
只问了一道算法题目。
leetcode原题稍微改了下。
https://leetcode.com/problems/copy-list-with-random-pointer/
该题目的解法在这里 : https://github.com/loverszhaokai/leetcode/blob/master/138/sol_1S_NT.cc
题目:在线性链表的基础上,每一个节点都增加一个random指针,该random指针指向该节点或者该节点之后的节点。返回深拷贝。
解法1:
struct RandomListNode { int label; RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) {} }; /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: // Time Complexcity: O(n^2) // Space Complexcity: O(n) RandomListNode *copyRandomList(RandomListNode *head) { list<RandomListNode *> random_nodes; if (!head) return NULL; RandomListNode *new_head = new RandomListNode(head->label); if (head->random == head) { new_head->random = new_head; } else { new_head->random = head->random; random_nodes.push_back(new_head->random); } RandomListNode *old_node = head->next; RandomListNode *new_node; RandomListNode *pre_node = new_head; while (old_node) { new_node = new RandomListNode(old_node->label); pre_node->next = new_node; pre_node = new_node; // Traverse random_nodes to find all the nodes whose random point to this node list<RandomListNode *>::iterator it = random_nodes.begin(); while (it != random_nodes.end()) { if (*it == old_node) { *it = new_node; random_nodes.erase(it); } else it++; } if (old_node->random == old_node) { new_node->random = new_node; } else { new_node->random = old_node->random; random_nodes.push_back(new_node->random); } old_node = old_node->next; }
return new_head; } };
解法2:
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: // Time Complexcity: O(n) // Space Complexcity: O(n) RandomListNode *copyRandomList(RandomListNode *head) { unordered_map<RandomListNode *, list<RandomListNode *> > parent_nodes; if (!head) return NULL; RandomListNode *new_head = new RandomListNode(head->label); if (head->random == head) { new_head->random = new_head; } else { parent_nodes[head->random].push_back(new_head); } RandomListNode *old_node = head->next; RandomListNode *new_node; RandomListNode *pre_node = new_head; while (old_node) { new_node = new RandomListNode(old_node->label); pre_node->next = new_node; pre_node = new_node; // Update the random pointer list<RandomListNode *> nodes = parent_nodes[old_node]; list<RandomListNode *>::iterator it = nodes.begin(); while (it != nodes.end()) { it->random = new_node; it++; } if (old_node->random == old_node) { new_node->random = new_node; } else { parent_nodes[old_node->random].push_back(new_node); } old_node = old_node->next; }
return new_head; } };
解法3:[面试官提示使用原来的链表,以达到O(1)的存储空间] 该方法不适合leetcode上的138题
struct RandomListNode { int label; RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) {} }; /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: // Time Complexcity: O(n) // Space Complexcity: O(1) RandomListNode *copyRandomList(RandomListNode *head) { if (!head) return NULL; RandomListNode *new_head = new RandomListNode(head->label); RandomListNode *old_node = head; RandomListNode *new_node = new_head; RandomListNode *pre_node = new_head; RandomListNode *next_old_node; new_node->random = old_node; next_old_node = old_node->next; old_node->next = new_node; old_node = next_old_node; while (old_node) { new_node = new RandomListNode(old_node->label); pre_node->next = new_node; pre_node = new_node; new_node->random = old_node; next_old_node = old_node->next; old_node->next = new_node; old_node = next_old_node; } old_node = head; new_node = new_head; while (new_node) { old_node = new_node->random; new_node->random = old_node->random == NULL ? NULL : (old_node->random)->next; old_node->next = new_node->next == NULL ? NULL : (new_node->next)->random; new_node = new_node->next; } return new_head; } };
3. 面试的实习职位,不会发校招offer,应该是88了。
作者:loverszhaokai
出处:http://www.cnblogs.com/lovers
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。