2017Facebook面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化

Posted tuple-joe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017Facebook面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化相关的知识,希望对你有一定的参考价值。

题目:一面砖墙

这道题改编自网上Facebook去年的一道面试题,是hihoCoder的1494题(https://hihocoder.com/problemset/problem/1494)

技术分享图片

 

  这道题猛一看好像没有什么思路,枚举起来感觉挺麻烦的。为了描述方便,我们在水平方向建立一个X轴,X=0的位置设成这面墙的左边缘。X轴的长度单位与砖的长度单位保持一致:
技术分享图片  
  这样对于每一个砖和砖之间交界的缝隙,都有一个X坐标。比如第一层天蓝色的缝隙,X坐标就是6,深蓝色的缝隙坐标就是10;第二层红色的缝隙坐标是8;第三层绿色的缝隙坐标是11。现在假设我要在X=a这个位置画一条竖线,这条线穿过了多少块砖,显然取决于X=a这个位置有多少个缝隙。这个位置的缝隙越多,穿过的砖数目就越少。于是我们有了一个比较清楚的枚举算法。首先计算所有砖块交界缝隙的坐标,看哪个坐标的缝隙最多,我们就在哪个坐标画线,这样穿过的砖块肯定最少。我们可以用unordered_map来做,key是缝隙的坐标,value是处于这个坐标的缝隙数量。
代码如下:
 1 #include <iostream>
 2 #include <unordered_map> 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;        //层数 
 8     int num;    //每层的个数 
 9     int x;        //横坐标 
10     int width;    //砖块的宽度 
11     unordered_map<int, int> cnt;
12     
13     cin >> n;
14     for(int i = 0; i < n; i++)
15     {
16         cin >> num;
17         x = 0; 
18         for(int j = 0; j < num; j++)
19         {
20             cin >> width;
21             x += width;
22             if(j != num - 1)    //排除砖墙的右边沿的划线 
23                 cnt[x]++;
24         }
25     }
26     
27     int max = 0;
28     for(auto item : cnt)        //auto是C++11标准里的关键字
29     {
30         if(item.second > max)
31             max = item.second;
32     } 
33     cout << n - max << endl;
34     
35     return 0;
36 }

 

运行结果如下:

技术分享图片

 


以上是关于2017Facebook面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化的主要内容,如果未能解决你的问题,请参考以下文章

华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?

习题讲解 | Google, Facebook高频面试题动态规划(DP)

2021阿里Java高级面试题总结

算法如何刷题

面试2017年初BAT的Java面试题汇集

2017年最新企业面试题之shell