Skip to main content

Command Palette

Search for a command to run...

合并箱子重量 —— 亚马逊 2022 面试题

Merge weight (Amazon 2022 OA)

Published
2 min read
合并箱子重量 —— 亚马逊 2022 面试题

#leetcode #算法

题目

Consider n packages, where packageWeights[i] represents the weight of the i th package, You can combine i th and i+1 th package if packageWeights[i] <packageWeights[i+1] and then discard the i th package. After this operation number of packages reduces by 1 and weight of i+1 th package increases by packageWeights[i]. You can merge as many times as you want. Find the max possible weight of the package that can be achieved after any sequence of merge operations

Eg packageWeights =[2,9,10,3, 7] optimal order:

  • iteration 1 combine packages at index 2 and 3 ->new packageWeights =[2,19,3,7]
  • iteration 2 combine packages at index 1 and 2 ->new packageWeights =[21,3,7]
  • iteration 3 combine packages at index 2 and 3 ->new packageWeights =[21,10]
  • No more packages can be combined. The weight of the heaviest package is 21 Result:21

分析

其实例子中给出来的分析已经足够。在理解这个问题的时候,可以直接尝试着用程序化的语言来理解,比如:

  1. packageWeights =[2,9,10,3, 7]; var max = 0;
  2. var index = 4; value = 7; current = 7; max = 7;
  3. index = 3; value = 3; value < current; current = 7 + 3; max = 10;
  4. index = 2; value = 10; value !< current; current = value(10); max = 10;
  5. index = 1; value = 9; value < current; current = 10 + 9; max = 19;
  6. index = 0; value = 2; value < current; current = 19 + 2; max = 21;
  7. return max;

代码

var packageCount = packageWeights.Length;
var max = 0;
if (packageCount == 0) { return max; }

var current = packageWeights[^1];
for (int index = packageCount - 1; index >= 0; index--)
{
    var value = packageWeights[index];
    current = value < current
        ? current + value
        : value;
    max = Math.Max(max, current);
}

return max;

有没有发现,在上一步中,当你用程序化的思维去理解这个问题的时候,编程就成了一种自然而然的语言转换了。 时间复杂度:O(n) 空间复杂度:O(1)

测试案例

如果你是在面对面的跟面试官沟通的话,往往面试官会问你要怎么设计测试用例。 其实这个也是考察你对编码的严谨性的。

本题的测试案例可以这样逐步来想:

  1. 只有一条重量数据:[TestCase(new[] { 2 }, ExpectedResult = 2)]
    1. 增加一个大重量的包在前面:[TestCase(new[] { 10, 2 }, ExpectedResult = 10)]
      1. 增加一个相同重量的包在前面:[TestCase(new[] { 10, 10, 2 }, ExpectedResult = 10)]
      2. 增加一个相同重量的包在后面:[TestCase(new[] { 10, 2, 2 }, ExpectedResult = 10)]
    2. 增加一个大重量的包在后面:[TestCase(new[] { 2, 10 }, ExpectedResult = 12)]
  2. 合并之后有两个包:[TestCase(new[] { 2, 9, 10, 3, 7 }, ExpectedResult = 21)]
  3. 合并之后只有一个包:[TestCase(new[] { 2, 9, 10, 3, 8 }, ExpectedResult = 32)]

More from this blog

你愿意相信机器,还是人

春节回家,跟老爸一起刷了小破球2。 之后忽然想到了这个话题:你愿意相信机器,还是人 (一) 春节的时候,陪老爸去配了一副眼镜。 因为前不久我也正好花重金配了一副,在之前做了很多的功课,诸如眼镜的前倾角、面弯、镜间距、单眼瞳高、单眼瞳距之类的知识,了解了一些配镜过程中应该注意的事项。 老家是一个小县城,虽然眼镜店遍地都是,但专业的还真没几个。在配镜的过程中,能注意到这些细节的眼镜店几乎没有。蔡司专业的三维定位的仪器,更是全县城都没有。 当我提出需要仪器辅助测量这些参数的时候,一个配镜师傅跟我说,...

Jan 30, 20231 min read2
你愿意相信机器,还是人

Cache 缓存三问

哎,我一个个人项目基本上都没有超过过两位数的QPS的人,面试你天天问我缓存的这些问题,你们礼貌吗? 缓存穿透 是啥 当请求试图访问一个在缓存和数据库都不存在的 key时,因为缓存没有,所以请求会直接转发到数据库上。然而数据库里面也没有这个 key 的记录,所以也就没有办法将这个数据写入缓存。当下一次同样的请求来了的时候,还是会转发到数据库上。 在这种情况下,缓存基本上也就没用了,就像被穿透了一样,请求每次都会走到数据库,流量大时数据库可能会扛不住。 咋整 对请求进行校验。一些明显不合理的参数直...

Jun 17, 20221 min read18
Cache 缓存三问

C# 托管代码和垃圾回收

什么是托管代码 托管代码就是执行过程交由运行时管理的代码。运行时一般是指 CLR,公共语言运行时。 CLR 负责提取托管代码、将其编译成机器代码,然后执行它。除此之外,运行时还负责自动内存管理、安全边界、类型安全等等。 如果在 .Net 里面直接调用 C/C++ 程序,此类代码也称为“非托管代码”。在非托管代码的环境中,操作系统将程序加载进内存,然后调用内部的二进制代码,所以从内存管理到安全等诸多因素都需要程序员自己处理。 正常使用 .Net 编写的代码,会先编译成中间语言 (IL)。执行的...

Jun 14, 20221 min read43
C# 托管代码和垃圾回收

C# 发布-订阅模式

#CSharp #PubSub 发布-订阅模式 有些时候,发布-订阅模式也会被称为观察者模式,但其实,如果细分的话,这两者之间还是有些细微的差别的。 观察者模式是在主题者(Subject)内部,维护一个观察者(Observer)列表。然后当主题者的状态发生变更的时候,主题者可以通知观察者发生了变化。观察者可以主动访问主题者,获得变更。也可以在通知观察者的时候,直接带上变更的消息。 在观察者模式中,主题者和观察者还是存在部分的耦合。因此,我们可以引入一个中介,来接触这种耦合。 类 A(发布者)发生...

Jun 8, 20222 min read80
C# 发布-订阅模式

NightBack

7 posts