富途一二三面
一面
9.25,一个小时
1. 手撕代码
1.1 买卖股票1
只能买卖一次
1.2 阶梯收费程序
2. 八股
浏览器按下enter全过程;
数据库索引类型,索引为什么用B+树;
http相关;
最后还做了几道选择题,有操作系统,正则表达式之类的。
二面
9.28,一个小时
1. 手撕代码
1.1 删除一个数后数组乘积最大值,返回下标
最开始只考虑了如下三种情况:
- 全都是正数:返回最小值的下标;
- 偶数个负数:返回最小的正数的下标;
- 奇数个负数:返回最大的负数的下标;
然后面试官说不完全正确让找一下问题,找了半天发现少考虑了一种情况:偶数个负数的情况下,如果数组中没有正数,那么返回的应该是最小值而非最小正数。
int maxMultiply(const vector<int> nums) { int n = nums.size(); int negCnt = 0; for (auto num : nums) { if (num < 0) { ++negCnt; } } int index = 0; // No negative num, or all num is neg and negCnt is even. if (negCnt == 0 || (negCnt % 2 == 0 && negCnt == n)) { int curMin = INT_MAX; for (int i = 0; i < n; ++i) { if (nums[i] < curMin) { index = i; curMin = nums[i]; } } return index; } // Even negative num and exist positive num. if (negCnt % 2 == 0) { int curMinPos = INT_MAX; for (int i = 0; i < n; ++i) { if (nums[i] >= 0 && nums[i] < curMinPos) { index = i; curMinPos = nums[i]; } } return index; } // Odd neg nums. int curMaxNeg = INT_MIN; for (int i = 0; i < n; ++i) { if (nums[i] < 0 && nums[i] > curMaxNeg) { index = i; curMaxNeg = nums[i]; } } return index; }
1.2 找到数组中第二大的数
int secMax(const vector<int>& nums) { int n = nums.size(); int max = nums[0]; int sec = INT_MIN; for (int i = 0; i < n; ++i) { if (nums[i] > max) { sec = max; max = nums[i]; } else if (nums[i] > sec) { sec = nums[i]; } } return sec; }
这道题要求的是第二个,所以可以用这种解法。如果要找第k大的值的话可以用**** 的方法。
2. 智力题:
等量红墨水蓝墨水,红墨水滴蓝墨水一滴,混合均匀后蓝墨水再滴到红墨水一滴,证明二者浓度。
3. 八股
之后没有多少时间了,就问了几道常规八股,不太记得了。
三面(HR面)
10.09,20min
怎么了解到富途的,为什么投递;
找工作最看重哪些因素;
三个词形容自己;
HR介绍公司情况;
反问。