ITPub博客

首页 > 应用开发 > Java > 算法题,容器盛水

算法题,容器盛水

原创 Java 作者:piliskys 时间:2017-08-21 09:09:04 0 删除 编辑
前几天看到阿里数据公众号有个技术题, 刚一开始以为结束了,一问还有最后一天,刚开始本想用sql来解答了,因为工作中,很难碰到烧脑的内容,不锻炼锻炼自己怕脑子不够使, 当时感觉比较容易,但sql想了下一些公用变量的东西不好弄,因此,还是决定用java来完成它,毕竟,java中的变量中的地址传递还是比较好弄的。
题目请看这里》》
附
上java内容:

  1. public class Jis {

  2.     /**
  3.      * 整体思路: 下雨后地面有多个小水坑,有高有低,有大有小
  4.      * 1,能藏水的说明边上有墙围着,相同小水坑都有相同高度的墙,把墙看成共享变量,只要连续的位置,最低的墙高度是相同的。 2,先外围全是墙,
  5.      * 如果位置的高度比周边的墙还高,那它自己也就是墙,否则自己的墙高度取周边的最低墙高度 3,最后遍历完就是把非墙的,用墙高度减自己高度的和。
  6.      */
  7.     public static Point[][] sz2;
  8.     public static int maxQ = 999;

  9.     public static void main(String[] args) {
  10.         // TODO Auto-generated method stub

  11.         int[] sz = new int[] {
  12.                 8, 8, 2, 8, 8,
  13.                 8, 0, 0, 0, 8,
  14.                 8, 8, 3, 8, 8,
  15.                 8, 0, 0, 0, 8,
  16.                 8, 8, 8, 4, 4
  17.                 };
  18.         int idx = (int) Math.sqrt(sz.length);
  19.         // 初始二维数组
  20.         sz2 = new Point[idx][idx];
  21.         for (int i = 0; i < idx; i++)
  22.             for (int j = 0; j < idx; j++) {
  23.                 sz2[i][j] = new Jis().new Point();
  24.                 sz2[i][j].value = sz[i * idx + j];
  25.                 if (i == 0 || i == idx - 1 || j == 0 || j == idx - 1) {
  26.                     sz2[i][j].isQ = true;
  27.                     sz2[i][j].getQheight().height = sz2[i][j].value;
  28.                 } else {
  29.                     sz2[i][j].getQheight().height = maxQ;

  30.                 }
  31.             }

  32.         for (int i = 1; i < idx - 1; i++)
  33.             for (int j = 1; j < idx - 1; j++) {
  34.                 // 根据周边的墙来设置自己
  35.                 check(sz2[i][j], sz2[i - 1][j]);
  36.                 check(sz2[i][j], sz2[i + 1][j]);
  37.                 check(sz2[i][j], sz2[i][j - 1]);
  38.                 check(sz2[i][j], sz2[i][j + 1]);
  39.                     //这里说明自己就是墙了
  40.                 if (sz2[i][j].value >= sz2[i][j].getQheight().height) {
  41.                     Qheight qh = new Jis().new Qheight();
  42.                     qh.height = sz2[i][j].value;
  43.                     sz2[i][j].setQheight(qh);

  44.                     sz2[i][j].isQ = true;
  45.                 }
  46.                 sz2[i][j].isCheck = true;
  47.                 // 根据自己设置周边的墙
  48.                 chage(sz2[i][j], sz2[i - 1][j]);
  49.                 chage(sz2[i][j], sz2[i + 1][j]);
  50.                 chage(sz2[i][j], sz2[i][j - 1]);
  51.                 chage(sz2[i][j], sz2[i][j + 1]);

  52.             }

  53.         int all = 0;
  54.         //算总体积
  55.         for (int i = 0; i < idx; i++)
  56.             for (int j = 0; j < idx; j++) {
  57.                 if (!sz2[i][j].isQ && sz2[i][j].getQheight().height > sz2[i][j].value)
  58.                     all += sz2[i][j].getQheight().height - sz2[i][j].value;
  59.             }
  60.         System.out.println("=================" + all);

  61.     }

  62.     public static void check(Point a, Point b) {
  63.         if (a.getQheight().height > b.getQheight().height && (b.isQ || b.isCheck)) {
  64.             a.getQheight().height = b.getQheight().height;
  65.         }
  66.     }

  67.     public static void chage(Point a, Point b) {

  68.         if (!a.isQ && !b.isQ) {
  69.             b.setQheight(a.getQheight());
  70.         }
  71.     }

  72.     class Point {
  73.         int value;
  74.         Qheight qheight = new Qheight();

  75.         boolean isQ = false;
  76.         boolean isCheck = false;

  77.         public Qheight getQheight() {
  78.             return qheight;
  79.         }

  80.         public void setQheight(Qheight qheight) {

  81.             this.qheight = qheight;
  82.         }

  83.     }

  84.     class Qheight {
  85.         int height;

  86.     }

  87. }
最后没想到还获奖了,获得一本 《大数据之路:阿里巴巴大数据实践》

虽然这本书前些日子刚买了,但还是要感谢这个活动。








来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/134308/viewspace-2143844/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2008-01-14

  • 博文量
    68
  • 访问量
    184718