360的总部在北京望京798附近,这周有朋友去面试了,讲了下大致过程。360总部一楼有个大厅,前台有很多MM,说明来意,被指向面试区(人还挺多的,应该很缺人,或者有新项目)。
一面:
技术面,是个小弟面的。
1)介绍下自己
2)说了几个重要的项目,问了些项目的情况,这都是面试官感兴趣的话题。
3)出了个编程题:设计一个trie树,实现创建 trie树和检索功能,数据为一批英文单词,都是小写字母。
分析:
这题目主要是三个方面,第一是设计trie树的数据结构,第二是实现trie树创建函数,第三是检索英文单词,看是否存在。
实现如下:
- #include<iostream>
- #include<string.h>
- using namespace std;
- #define MAXNODE 26
- struct TrieNode{
- int counts;
- TrieNode* next[MAXNODE];//next character
- TrieNode():counts(1){
- int i = 0;
- while(i < MAXNODE)
- {
- next[i++] = NULL;
- }
- }
- };
- void createTrie(TrieNode* &root, char* str)
- {
- if(strlen(str) <= 0) return;
- if(root == NULL)
- root = new TrieNode();
- int i = 0;
- TrieNode* p = root;
- while(i < strlen(str))
- {
- int k = str[i++] - 'a';
- if(p->next[k])
- {
- p->next[k]->counts ++;
- }
- else
- p->next[k] = new TrieNode();
- p = p->next[k];
- }
- }
- int SearchTrie(TrieNode* root, char* str)
- {
- TrieNode* p = root;
- if(p == NULL) return -1;
- int i = 0;
- while(i < strlen(str))
- {
- int k = str[i++] - 'a';
- if(p->next[k] == NULL)
- return 0;
- else
- p = p->next[k];
- if(i == strlen(str))
- return p->counts;
- }
- }
- int main()
- {
- char a[][4] = {"abc", "bcd", "ade", "acd", "bgf"};
- int i = 0;
- int j = 0;
- TrieNode* root = NULL;
- while(i < 5)
- {
- createTrie(root, a[i++]);
- }
- char* b = "bcd";
- int in = SearchTrie(root, b);
- if( in <= 0)
- cout << "Trie can't find \"" << b << "\"" << endl;
- else
- cout << "Trie have find \"" << b << "\"" << endl;
- return 0;
- }
输出结果为:
Trie have find "bcd"
总结:
这个算法可以用于字符串的前缀查询,比如搜索TIPS等。