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

Google二跪

 
全局:

2018(10-12月) 码农类General 硕士 全职@google - 内推 - 技术电面  | | Other | 应届毕业生

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

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

x
刚刚结束的谷歌电面,已经妥妥地感觉到了凉意。二跪谷歌,哎

一道DP的题目。玩卡牌,N张卡,卡上有数字,可正可负。两个玩家,每个人最多可以选1,2或
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
特别厉害,祝大家找工作顺利!(没错,我发了两遍,第一次用补充功能。。)欢迎小伙伴一起探讨刷题良策!

评分

参与人数 17大米 +79 收起 理由
Self_Learner + 2 给你点个赞!
DeerSong + 3 给你点个赞!
wulaoshi250 + 3 给你点个赞!
yingbingwang + 5 很有用的信息!
bc2615 + 5 给你点个赞!

查看全部评分


上一篇:推特 ML面筋
下一篇:google电面

本帖被以下淘专辑推荐:

  • · google|主题: 216, 订阅: 124
推荐
engx2 2018-10-5 08:58:11 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

评分

参与人数 23大米 +87 收起 理由
siranjoy119 + 2 很有用的信息!
tony.hu1213 + 2 欢迎分享你知道的情况,会给更多积分奖励!
凌青eryu + 2 给你点个赞!
hreat + 2 给你点个赞!
xwyin + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

推荐
红A 2018-9-8 05:17:27 | 只看该作者
全局:
写了个recursive版本的


  1.     public int findMaxScore(int[] cards) {
  2.         int[] memo = new int[cards.length];
  3.         int sum = 0;
  4.         for (int card: cards) sum += card;
  5.         return (sum + helper(cards, 0, memo)) / 2;
  6.     }

  7.     public int helper(int[] cards, int cur, int[] memo) {
  8.         if (cur == cards.length - 1) return cards[cur];
  9.         if (cur == cards.length - 2) return Math.max(cards[cur] - cards[cur + 1], cards[cur] + cards[cur + 1]);
  10.         if (cur == cards.length - 3) {
  11.             int valOne = cards[cur] - Math.max(cards[cur + 1] - cards[cur + 2], cards[cur + 1] + cards[cur + 2]);
  12.             int valTwo = cards[cur] + cards[cur + 1] - cards[cur + 2];
  13.             int valThree = cards[cur] + cards[cur + 1] + cards[cur + 2];
  14.             return Math.max(valOne, Math.max(valTwo, valThree));
  15.         }
  16.         if (memo[cur] > 0) return memo[cur];
  17.         int oneCardValue = cards[cur] - helper(cards, cur + 1, memo);
  18.         int twoCardValue = cards[cur] + cards[cur + 1] - helper(cards, cur + 2, memo);
  19.         int threeCardValue = cards[cur] + cards[cur + 1] + cards[cur + 2] - helper(cards, cur + 3, memo);
  20.         memo[cur] = Math.max(oneCardValue, Math.max(twoCardValue, threeCardValue));
  21.         return memo[cur];
  22.     }


复制代码



评分

参与人数 7大米 +26 收起 理由
hreat + 2 给你点个赞!
高渐离击筑高歌 + 5 给你点个赞!
真淘蛮 + 5 给你点个赞!
daijidj + 5 给你点个赞!
Georgeapex + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
wisdompeak2 2018-9-21 16:56:11 | 只看该作者
全局:
贴一个DP的解法,如有问题还请指正。
  1. #include <iostream>

  2. bool solution(vector<int>nums)
  3. {   
  4.     int N = nums.size();
  5.     vector<int>sum(N+1);
  6.     sum[N] = 0;
  7.     for (int i=N-1; i>=0; i--)
  8.         sum[i] = sum[i+1]+nums[i];
  9.    
  10.     vector<int>dp(N+1,0);
  11.     dp[N-1]=sum[N-1];
  12.     dp[N-2]=max(sum[N-2],nums[N-2]);
  13.    
  14.     for (int i=N-3; i>=0; i--)
  15.     {
  16.         int scoreA = nums[i]+sum[i+1]-dp[i+1];
  17.         int scoreB = nums[i]+nums[i+1]+sum[i+2]-dp[i+2];
  18.         int scoreC = nums[i]+nums[i+1]+nums[i+2]+sum[i+3]-dp[i+3];
  19.         dp[i] = max(scoreA,scoreB);
  20.         dp[i] = max(dp[i],scoreC);
  21.     }
  22.     return dp[0]>=sum[0]-dp[0];        
  23. }

  24. int main()
  25. {
  26.     vector<int>nums({1,2,-3,8});   
  27.     cout<<solution(nums)<<endl;
  28. }
复制代码

评分

参与人数 3大米 +10 收起 理由
hreat + 2 给你点个赞!
guyao + 5 给你点个赞!
SaltSprayAir + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
红A 2018-9-8 03:25:01 | 只看该作者
全局:
这拿牌有顺序的吧,只能从两边拿吗,还是只能从头到尾按照顺序拿?
回复

使用道具 举报

🔗
 楼主| June0713 2018-9-8 03:31:30 | 只看该作者
全局:
rexue70 发表于 2018-9-8 03:25
这拿牌有顺序的吧,只能从两边拿吗,还是只能从头到尾按照顺序拿?

从头到尾按顺序拿

评分

参与人数 1大米 +20 收起 理由
红A + 20 momo楼主,还有其他好机会的,Best wishes.

查看全部评分

回复

使用道具 举报

🔗
baz 2018-9-8 03:48:11 | 只看该作者
全局:
June0713 发表于 2018-9-8 03:31
从头到尾按顺序拿

按顺序拿?能跳牌吗?两个人必须间隔吗?
回复

使用道具 举报

🔗
CHITYUEN 2018-9-8 03:48:43 | 只看该作者
全局:
跟从两头拿思路应该是一样的
  1. 拿一张 = sum[i + 1][j] - dp[i + 1][j] + nums[i]
  2. 拿二张 = sum[i + 2][j] - dp[i + 2][j] + nums[i] + nums[i + 1]
  3. 拿三张 = sum[i + 3][j] - dp[i + 3][j] + nums[i] + nums[i + 1] + nums[i + 2]
  4. dp[i][j] = max(拿一张, 拿二张, 拿三张)
复制代码

回复

使用道具 举报

🔗
 楼主| June0713 2018-9-8 04:22:21 | 只看该作者
全局:
Barnett-wjq 发表于 2018-9-8 03:48
按顺序拿?能跳牌吗?两个人必须间隔吗?

对,按顺序拿,不能跳牌,两个人轮流来
回复

使用道具 举报

🔗
 楼主| June0713 2018-9-8 04:22:56 | 只看该作者
全局:
CHITYUEN 发表于 2018-9-8 03:48
跟从两头拿思路应该是一样的[mw_shl_code=java,true]拿一张 = sum[j] - dp[j] + nums
拿二张 = sum[j] - d ...

麻烦问一下,这题是地里面经题么?我之前面经看很少。感谢感谢!
回复

使用道具 举报

🔗
CHITYUEN 2018-9-8 04:47:27 | 只看该作者
全局:
June0713 发表于 2018-9-8 04:22
麻烦问一下,这题是地里面经题么?我之前面经看很少。感谢感谢!

leetcode上有个很类似的题是每次从两头拿看谁能赢
回复

使用道具 举报

🔗
贝紫 2018-9-8 05:04:54 | 只看该作者
全局:
请问是每人每次可以选1到3张,直到最后选完么?
回复

使用道具 举报

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

本版积分规则

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