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

新鲜亚麻 Amazon OA社招 2021

🔗
匿名用户-DLDUO  2021-2-16 08:23:29 来自APP |倒序浏览

2021(1-3月) 码农类General 硕士 全职@amazon - 猎头 - 在线笔试  | | Other | 在职跳槽

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

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

x
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

评分

参与人数 6大米 +15 收起 理由
一只胖皮 + 1 很有用的信息!
地中有山 + 1 给你点个赞!
yiliaobailiao + 3 很有用的信息!
匿名用户-DREXE + 7
喵喵~ + 1 给你点个赞!

查看全部评分


上一篇:Bloomberg 店面
下一篇:wish phone
地里匿名用户
推荐
匿名用户-DLDUO  2021-2-27 02:18:30
本帖最后由 匿名 于 2021-2-27 02:20 编辑

感谢大家的提醒,之前我的code和解释,因为我的左右不分完全错乱了, 抱歉>_<。评论不能修改,我统一在这里更正一下,用low,high来表示双指针:
  1. solution(int[] arr){
  2.         sort(arr);
  3.         low = 0;
  4.         high = arr.length - 1;
  5.         diff = arr[high];
  6.         while(low < high){
  7.             if(arr[low] < diff){
  8.                 diff = diff - arr[low];
  9.                 low++;
  10.             }else{
  11.                 high—-;
  12.                 diff = diff + arr[high];
  13.             }
  14.         }
  15.         for(int i : high to arr.length - 1){
  16.             A.add(arr[i];
  17.         }
  18.         return A;
  19.     }
复制代码


1. low, high两个指针不是在找最终结果,是在找A,B 的分界点。因为按照题目的要求,只要从weight最大到小把item 加入A, 当A 的总weight大于剩下另一半的item的weight总和(就是会分到B组里的所有item),这个时候A 就是符合要求的结果。
2. diff 初始化是weight最大的item(high指向的,也就是第一个放进A 里的item)的weight, low初始化指向的是weight最小的item(会被放进B中的item,这个时候还没有放入).  
3. Low, high指针  移动的判断标准就是:
    当arr[low] < diff,  说明A多出来的重量 - arr[low] 还是 > 0, arr[low] 加入B组,diff = diff - arr[low], low++ 。
    反之 arr[low] >= diff,   就说明A 多出的重量(diff) 不大于 arr[low],需要从high的一边加入新的item来增加重量, high—, diff = diff + arr[high]。注意这里high 必须先 左移,再加入A (因为diff的初始化让high指向的item已经加入了A)。
4. 当low, high 相遇,说明找到A,B 的分割点。从分割点把item加入A, 然后返回A就可以了。

厚脸皮再求一次大米~~ >_<
[/i]

评分

参与人数 1大米 +1 收起 理由
喵喵~ + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

地里匿名用户
推荐
匿名用户-DLDUO  2021-2-22 13:06:53
喵喵~ 发表于 2021-2-21 14:04
可以详细说一下双指针的思路吗?谢谢!

大概思路是这样的:
  1. solution(int[] arr){
  2.         sort(arr);
  3.         Diff = arr[arr.length -1];
  4.         Int left = 0;
  5.         Int right = arr.length - 1;
  6.         while(right < left){
  7.             if(arr[right] < diff){
  8.                 diff = diff - arr[right];
  9.                 right++;
  10.             }else{
  11.                 left—;
  12.                 diff = diff + arr[left];
  13.             }
  14.         }
  15.         for(int i : left to arr.length - 1){
  16.             A.add(arr[i];
  17.         }
  18.         return A;
  19.     }
复制代码
[/i]

补充内容 (2021-2-27 01:33):
不好意思,我这个左右不分,在while里把left和right搞混了,后面的解释也估计和混乱。应该是判断 arr[left] <diff, 然后left++ 或者 right--。

补充内容 (2021-2-27 02:24):
请翻到后面的回帖,我更正了code和解释。
回复

使用道具 举报

地里匿名用户
推荐
匿名用户-DLDUO  2021-2-26 03:09:07
Mark6 发表于 2021-2-25 15:46
前两天面的,跟楼主的题目一样。没大看懂楼主的diff用来存什么的。不是尽可能选大的数字吗,怎么还需要le ...

1. 左右两个指针不是在找最终结果,是在找A,B 的分界点。因为按照题目的要求,只要从weight最大到小把item 加入A, 当A 的总weight大于剩下另一半的item的weight总和(就是会分到B组里的所有item),这个时候A 就是符合要求的结果。
2. diff 初始化是weight最大的item(left指向的,也就是第一个放进A 里的item)的weight, right初始化指向的是wieght最小的item(会被放进B中的item,这个时候还没有放入).  
3. right, left  移动的判断标准就是:
    当arr[right] < diff,  说明A多出来的重量- arr[right] 还是 > 0, arr[right] 加入B组,diff = diff - arr[right], right++ 。
    反之 arr[right] >= diff,   就说明A 剩下的重量比arr[right]小,需要加入新的item来增加重量, left--, diff = diff + arr[left]。注意这里left 必须 右移,再加入A (因为diff的初始化让left指向的item已经加入了A)。
   code是过了所有给出的test cases的。不知道表达的清楚不,已经尽力了  >_<~

补充内容 (2021-2-27 01:44):
前面的code和这里的解释都被我把right和left搞反了(左右不分的人~>_<~), 这里补充更正下:
right 指向的是weight大的一边的item,是放进A组。 left一边是weight小的,即将会被放进B组的item。

补充内容 (2021-2-27 01:45):
应该是判断 arr[left] <diff, 然后left++ 或者 right—。

补充内容 (2021-2-27 02:24):
请翻到后面的回帖,我更正了code和解释。
回复

使用道具 举报

🔗
wznfls 2021-2-19 12:03:11 | 只看该作者
全局:
感觉按顺序取的话 不对呀。。
比如 1,3,10,4,4,1

排序 从大到小 得到结果是 10,4,4
但最优解是10,3
回复

使用道具 举报

🔗
alexzz 2021-2-19 14:50:51 | 只看该作者
全局:
wznfls 发表于 2021-2-19 12:03
感觉按顺序取的话 不对呀。。
比如 1,3,10,4,4,1

这题不能用贪心做,本质上是个背包问题
回复

使用道具 举报

🔗
喵喵~ 2021-2-21 14:04:08 | 只看该作者
全局:
可以详细说一下双指针的思路吗?谢谢!
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-DLDUO  2021-2-22 13:12:43
wznfls 发表于 2021-2-19 12:03
感觉按顺序取的话 不对呀。。
比如 1,3,10,4,4,1

输入: 1,3,10,4,4,1
结果应该是: 4,10
题目中有一句: If more than one subset A exists, return the one with the maximal total weight.
回复

使用道具 举报

🔗
yiliaobailiao 2021-2-25 12:21:36 | 只看该作者
全局:
匿名者 发表于 2021-2-22 13:12
输入: 1,3,10,4,4,1
结果应该是: 4,10
题目中有一句: If more than one subset A exists, return t ...

主要还是这个intersection的理解吧。到底是不是相同值的元素,必须放在一边。还是每一个item只能用一次。
回复

使用道具 举报

🔗
yiliaobailiao 2021-2-25 12:33:28 | 只看该作者
全局:
匿名者 发表于 2021-2-22 13:06
大概思路是这样的:
[mw_shl_code=bash,true]solution(int[] arr){
        sort(arr);

left, right看着有点乱啊。。。
回复

使用道具 举报

🔗
Mark6 2021-2-25 15:46:54 | 只看该作者
全局:
匿名者 发表于 2021-2-22 13:06
大概思路是这样的:
[mw_shl_code=bash,true]solution(int[] arr){
        sort(arr);

前两天面的,跟楼主的题目一样。没大看懂楼主的diff用来存什么的。不是尽可能选大的数字吗,怎么还需要left指针,找小的呢。。
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-DLDUO  2021-2-26 02:51:03
yiliaobailiao 发表于 2021-2-25 12:21
主要还是这个intersection的理解吧。到底是不是相同值的元素,必须放在一边。还是每一个item只能用一次。

每个item只能用一次, 一个item不会同时存在A 和 B里,就没有intersection了。
回复

使用道具 举报

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

本版积分规则

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