📣 独立日限时特惠: VIP通行证立减$68
回复: 38
跳转到指定楼层
上一主题 下一主题
收起左侧

Facebook二面跪经。。。

全局:

2015(1-3月) 码农类General 本科 实习@meta - 校园招聘会 - 技术电面  | | Other | 应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
刚面完的facebook二面,一个工作5年的印度小哥,infrastructure组的。。跪的很惨。。特别惨。。第一题瞬秒,follow up的第二题没
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies


唉,这是最后一个面试了,暑假没地方去了。。。好好学习申研究生去了。。。T T

评分

参与人数 3大米 +35 收起 理由
740919074 + 2 谢谢分享
chenyx95 + 3 给你点个赞!
夏虫不知雪花 + 30

查看全部评分


上一篇:Yelp Skype面
下一篇:Snapchat 电面面经
推荐
nuanuan1208 2016-3-15 11:39:35 | 只看该作者
全局:
        public int getMaxValue(int[] nums, int n, int k) {
                int len = nums.length;
        int[] sum = new int[len];
                for(int i = 0; i < len; i++) {
            sum[i] = (i == 0 ? 0 : sum[i-1]) + nums[i];
                }
                if(len <= n * k) return sum[len-1];
                // ask interviewer if the method should return 0 when len < n*k
        int[] prev = new int[len+1];
                for(int i = 1; i <= k; i++) {
            int[] dp = new int[len+1];
                        for(int j = i * n; j <= len; j++) {
                                if(j == i * n) dp[j] = sum[j-1];
                                else dp[j] = Math.max(dp[j-1], sum[j-1] - sum[j-n-1] + prev[j-n]);
                        }
            prev = dp;
                }
                return prev[len];
        }
优化了一下,希望不要再有bug了
回复

使用道具 举报

推荐
guschen802 2016-3-15 08:28:12 | 只看该作者
全局:
這是我的想法,應該和他說的差不多吧@tk1322715, 簡單來說就是3個windows。我以中間的window為基準,往右滑動保持windows的合,然後,每次滑動,左右各用第一題的算法找出左邊最大以及右邊最大的windows合,3個相加后維護最大值,代碼如下:

  1. import java.util.*;
  2. public class Solution {
  3.     public static void main(String[] args) {
  4.         int[] nums = new int[]{1,3,7,7,2,1,1,4,8,8,6,1,1,9};
  5.         System.out.println(maxThreeWindowSum(nums,2));
  6.     }

  7.     public static int maxWindowSum(int[] nums, int start, int end, int n) {
  8.         if (nums == null || end - start+1 < n) throw new IllegalArgumentException();
  9.         int sum = 0;
  10.         int max = Integer.MIN_VALUE;
  11.         Queue<Integer> window = new LinkedList<>();
  12.         for (int i = start; i <= end ; i++) {
  13.             if(window.size() < n-1) {
  14.                 sum+=nums[i];
  15.                 window.offer(nums[i]);
  16.             } else {
  17.                 sum+=nums[i];
  18.                 window.offer(nums[i]);
  19.                 max = Math.max(max,sum);
  20.                 sum-=window.poll();
  21.             }
  22.         }
  23.         return max;
  24.     }

  25.     public static int maxThreeWindowSum(int[] nums, int n) {
  26.         if (nums == null || nums.length < 3*n) throw new IllegalArgumentException();
  27.         //move the window in the middle and find max window at both side;
  28.         int max = Integer.MIN_VALUE;
  29.         int middle = 0;
  30.         Queue<Integer> window = new LinkedList<>();
  31.         for (int i = n; i < nums.length-2*n; i++) {

  32.             if(window.size() < n-1) {
  33.                 middle+=nums[i];
  34.                 window.offer(nums[i]);
  35.             } else {
  36.                 middle+=nums[i];
  37.                 window.offer(nums[i]);
  38.                 int left = maxWindowSum(nums, 0, i-n, n);
  39.                 int right = maxWindowSum(nums, i+1, nums.length -1, n);
  40.                 max = Math.max(max, left + middle + right);
  41.                 middle-=window.poll();
  42.             }
  43.         }
  44.         return max;
  45.     }
  46. }
复制代码


补充内容 (2016-3-15 08:29):
時間應該是O(n^2)

补充内容 (2016-3-15 08:36):
33筆誤,應為i < nums.length -n;
回复

使用道具 举报

推荐
nuanuan1208 2016-3-15 09:27:30 | 只看该作者
全局:
public class KWindow{

        // n is the number of consecutives, k is the number of counts
        public int getMaxValue(int[] nums, int n, int k) {
                int len = nums.length;
                for(int i = 1; i < len; i++) {
                        nums[i] += nums[i-1];
                }
                if(len <= n * k) return nums[len-1];
                // ask interviewer if the method should return 0 when len < n*k
                int[][] dp = new int[k+1][len+1];
                for(int i = 1; i <= k; i++) {
                        for(int j = 1; j <= len; j++) {
                                if(j <= n) dp[i][j] = nums[j-1];
                                else dp[i][j] = Math.max(dp[i][j-1], nums[j-1] - nums[j-n-1] + dp[i-1][j-n-1]);
                        }
                }
                return dp[k][len];
        }

        public static void main(String[] args) {
                KWindow window = new KWindow();
                int[] nums = new int[] {1,3,7,7,2,1,1,4,8,8,6,1,1,9};
                int n = 2, k = 3;
                System.out.println(window.getMaxValue(nums, n, k) == 40);
        }
}
回复

使用道具 举报

🔗
 楼主| zhenjieruan 2016-3-15 06:09:49 | 只看该作者
全局:
各位大神第二题给个思路呗。。。
回复

使用道具 举报

🔗
tk1322715 2016-3-15 06:38:11 | 只看该作者
全局:
zhenjieruan 发表于 2016-3-15 06:09
各位大神第二题给个思路呗。。。

我有一个n^2的解法。待会儿用电脑打,期待大神的n解法
回复

使用道具 举报

🔗
 楼主| zhenjieruan 2016-3-15 06:44:42 | 只看该作者
全局:
tk1322715 发表于 2016-3-15 06:38
我有一个n^2的解法。待会儿用电脑打,期待大神的n解法

我n^2的解法都没想出来。。是不是generate所有可能的non-overlap的combination然后输出最大的那个,但是这个是n^3。。。面试官的意思是n^2最优了。。
回复

使用道具 举报

🔗
wtcupup 2016-3-15 06:56:12 | 只看该作者
全局:
第一题需要O(N)吗?还是O(N^2)就行了,你是怎么做的?
回复

使用道具 举报

🔗
 楼主| zhenjieruan 2016-3-15 06:59:23 | 只看该作者
全局:
wtcupup 发表于 2016-3-15 06:56
第一题需要O(N)吗?还是O(N^2)就行了,你是怎么做的?

第一题O(n)啊,超级简单的,你保持一个deque,size=k,然后一个currentSum一个maxSum,每次就是pop front,减掉,currentSum加目前数,pushback目前数。代码(面试时候写的,不知道有没有bug):
int maxSum(vector<int>& a, int k) {
  if (a.size() < k) return -1;
  int currMax = 0, start = a[0],  currSum = 0;
  deque<int> window;
  for (int i = 0; i < k; ++i) {
    window.push_back(a[i]);
    currSum += a[i];
  }
  currMax = currSum;
  for (int i = k ; i < a.size(); ++i) {
    currSum -= window.front();
    window.pop_front();
    currSum += a[i];
    window.push_back(a[i]);
    currMax = ::max(currSum, currMax);
  }
  return currMax;
}
回复

使用道具 举报

🔗
tk1322715 2016-3-15 07:08:28 | 只看该作者
全局:
zhenjieruan 发表于 2016-3-15 06:44
我n^2的解法都没想出来。。是不是generate所有可能的non-overlap的combination然后输出最大的那个,但是 ...

大概思路就是设一个变量x,算出0-x之间一个连续n个数求和最大值。 然后在x-size之间算出两个non overlap n numbers 求和的最大值。这一步是o(n)的,所以总的是o(n^2)
回复

使用道具 举报

全局:
zhenjieruan 发表于 2016-3-15 06:59
第一题O(n)啊,超级简单的,你保持一个deque,size=k,然后一个currentSum一个maxSum,每次就是pop fron ...

这第1题,不就是max subarray sum么?
kadane 算法?
  1. public static int maxSubArray(int[] A) {
  2.     int maxSoFar=A[0], maxcurrent=A[0];
  3.     for (int i=1;i<A.length;++i){
  4.         maxcurrent= Math.max(current+A[i],A[i]);
  5.         maxSoFar=Math.max(maxSoFar, maxcurrent);
  6.     }
  7.     return maxSoFar;
  8. }
复制代码
回复

使用道具 举报

🔗
 楼主| zhenjieruan 2016-3-15 07:14:01 | 只看该作者
全局:
tk1322715 发表于 2016-3-15 07:08
大概思路就是设一个变量x,算出0-x之间一个连续n个数求和最大值。 然后在x-size之间算出两个non overlap n ...

我理解0-x应该怎么做,但是x-size应该怎么做呢?是分治吗?
回复

使用道具 举报

🔗
 楼主| zhenjieruan 2016-3-15 07:15:33 | 只看该作者
全局:
xiaozhuxiaozhu 发表于 2016-3-15 07:11
这第1题,不就是max subarray sum么?
kadane 算法?

你的k在哪里?是k个连续数的和最大
回复

使用道具 举报

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

本版积分规则

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