一直以为日本公司的面试会是日本人惨不忍睹的英语什么的。。。
面试前几天用“英语流利说”狂练了一阵子,发现自己的英语口语真心不忍直视。
约定时间之后几分钟,Skype准时响起。
居然是个美国人。
首先是用英语互相介绍,我讲了一下项目,磕磕巴巴,他倒是不停说Cool,也不知道听懂没有。
然后丢了个网址过来,做算法题。
好吧不按套路出牌啊= =
非常经典的2 Sum。
上来写了个O(N^2)的算法。。。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> a;
int n=numbers.size();
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(numbers[i]+numbers[j]==target){
a.push_back(i+1);
a.push_back(j+1);
}
}
}
return a;
}
};
循环条件外层不小心多了一次,但其实不会溢出。
面试官好心提醒,没发现= =
========================================
面试官提醒之后,写出O(N)的代码,利用HashTable。
C++11新引入的unordered_map,使用比较方便。
(添加为赋值a[key]=value,查找为a.find(value),若找不到返回a.end() iterator)
算法:
数组元素为key,序号为value。
若元素不在HashTable中,加入HashTable。
判断target-元素是否在HashTable中,若存在且不是当前元素(要用两个不同元素组成和),问题得解。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> ret;
unordered_map<int,int> table;
int n=numbers.size();
bool f=false;
for(int i=0;i<n;i++){
if(table.find(numbers[i])==table.end()) table[numbers[i]] = i+1;
if(table.find(target-numbers[i])!=table.end()){
int a=table[target-numbers[i]];
int b=i+1;
if(a!=b){
ret.push_back(a);
ret.push_back(b);
break;
}
}
}
return ret;
}
};