楼主: mc422
跳转到指定楼层
上一主题 下一主题
收起左侧

Google电面,面经

🔗
Wizmann 2015-9-30 16:05:41 | 只看该作者
全局:
gp89757 发表于 2015-9-30 15:48
第二问就是求surpass吧,一般是用BIT或者merge sort吧 都是nlogn的 BST应该是类似的思路

merge sort好顶赞
回复

使用道具 举报

🔗
gp89757 2015-9-30 16:12:46 | 只看该作者
全局:
  1. #include <vector>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <utility>

  5. using namespace std;


  6. //left pass
  7. void merge_sort(vector<pair<int,int>> &vp, vector<int> &sp) {
  8.     if (vp.size() < 2) return;
  9.     int m = vp.size()/2;
  10.     vector<pair<int,int>> va(vp.begin(), vp.begin()+m),
  11.         vb(vp.begin()+m, vp.end());
  12.     merge_sort(va, sp);
  13.     merge_sort(vb, sp);
  14.     for (int i=0,j=0,k=0; i<va.size()||j<vb.size();) {
  15.         if (i<va.size() && j<vb.size()) {
  16.             if (va[i].first > vb[j].first)
  17.                 vp[k++] = va[i++];
  18.             else {
  19.                 int id = vb[j].second;
  20.                 sp[id] += i;
  21.                 vp[k++] = vb[j++];
  22.             }
  23.         }
  24.         else if (i<va.size())
  25.             vp[k++] = va[i++];
  26.         else {
  27.             int id = vb[j].second;
  28.             sp[id] += i;
  29.             vp[k++] = vb[j++];
  30.         }
  31.     }
  32. }
  33. int left_pass(vector<int> v) {
  34.     int len = v.size();
  35.     vector<int> sp(len, 0);
  36.     vector<pair<int,int>> vp;
  37.     for (int i=0; i<v.size(); i++)
  38.         vp.push_back(make_pair(v[i], i));
  39.     merge_sort(vp, sp);
  40.     int ans = 0;
  41.     for (auto x:sp)
  42.         ans = max(ans, x);
  43.     return ans;
  44. }

  45. int left_pass_brute_force(vector<int> v) {
  46.     int ans = 0;
  47.     for (int i=1; i<v.size(); i++) {
  48.         int cnt = 0;
  49.         for (int j=i-1; j>=0; j--)
  50.             if (v[i] < v[j]) cnt++;
  51.         ans = max(ans, cnt);
  52.     }
  53.     return ans;
  54. }

  55. void test_left_pass(int ncase) {
  56.     int npass = 0;
  57.     for (int i=0; i<ncase; i++) {
  58.         int size = rand()%1007;
  59.         vector<int> v(size);
  60.         for (int j=0; j<size; j++)
  61.             v[j] = rand()%17;
  62.         if (left_pass(v) == left_pass_brute_force(v))
  63.             npass ++;
  64.     }
  65.     printf("%d/%d\n", npass, ncase);
  66. }

  67. int main()
  68. {   
  69.     test_left_pass(1007);
  70.     return 0;
  71. }
复制代码
回复

使用道具 举报

🔗
guzi 2015-9-30 21:26:41 | 只看该作者
全局:
mileschen2008 发表于 2015-9-30 10:15
我觉得第二题可以用Java 的 TreeSet,TreeSet是Red-black bst。但是呢,有个限制条件是数组必须没有dupli ...

请问如何用tree set 呢?如果是自己写AVL or Red-black tree, 在insert 每个node时候,可以count有多少个数比当前的大, 但是用tree set 的 add(node)函数,直接就插入树里,how to count number of elements larger than the current node?
回复

使用道具 举报

🔗
monolake 2015-10-1 00:45:44 | 只看该作者
全局:
第一题求测试,sorted array, O(logn)

int totalPass(int * num, int size) {
       
        int start = 0;
        int end = size - 1;
        int min_value = 0;
        while(start <= end) {

                int mid = (start + end) / 2;
                if(start != mid) {

                        /*num[start] either less than or \
                        equal to num[mid] after sort*/
                        if(num[start] < num[mid]) {
                                min_value += (end - mid + 1);
                                end = mid - 1;
                        }
                        else if(num[start] == num[mid]) {
                                start = mid + 1;
                        }

                }
                else {

                        /*start overlaps with mid, \
                        either start != end, or \
                        start == end*/
                        if(num[start] < num[end]) {
                                min_value += 1;
                        }
                        break;

                }

        }

        return min_value;

}
回复

使用道具 举报

🔗
newlxnewlx 2015-10-1 03:59:33 | 只看该作者
全局:
guzi 发表于 2015-9-30 21:26
请问如何用tree set 呢?如果是自己写AVL or Red-black tree, 在insert 每个node时候,可以count有多少个 ...

用TreeMap统计重复,用tailMap找到比当前key大的
static int leftPass(List<Integer> nums) {
        TreeMap<Integer, Integer> prevElements = new TreeMap<>();
        int maxLeftPass = 0;
        for (int n : nums) {
            maxLeftPass = Math.max(maxLeftPass, prevElements.tailMap(n, false).values().stream().mapToInt(i -> i).sum());
            prevElements.put(n, prevElements.getOrDefault(n, 0) + 1);
        }
        return maxLeftPass;
    }
回复

使用道具 举报

🔗
mileschen2008 2015-10-1 04:16:59 | 只看该作者
全局:
newlxnewlx 发表于 2015-10-1 03:59
用TreeMap统计重复,用tailMap找到比当前key大的
static int leftPass(List nums) {
        TreeMap p ...

你这个复杂度应该是O(n^2)了吧?
回复

使用道具 举报

🔗
坐看云起 2015-10-1 08:02:16 | 只看该作者
全局:
第二题是Segment Tree? LintCode 上面有
回复

使用道具 举报

🔗
newlxnewlx 2015-10-2 03:49:39 | 只看该作者
全局:
mileschen2008 发表于 2015-10-1 04:16
你这个复杂度应该是O(n^2)了吧?

你是对的  如果有重复元素的话要把所有count加起来,内层需要时间O(n).
如果不含重复元素可以直接返回tailMap(n, false).size().  获得这个tailMap的复杂度本身没有官方说明,但肯定不是O(n)
回复

使用道具 举报

🔗
zxy_snow 2015-10-9 15:53:09 | 只看该作者
全局:
第二问是不是可以用C++的STL中的multiset,每插入一个,可以算出来前面的个数,是nlogn的。当然也可以用线段树。BST的话类似线段树的思想了,加入一个数,更新左子树数目,右子树数目。
回复

使用道具 举报

🔗
aiweiwei 2015-10-9 21:46:58 | 只看该作者
全局:
请问楼主拿到onsite后约到什么什么on site呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表