您当前的位置:首页 > 生活百科 > 职场

算法面试 - 水壶问题

时间:2020-03-17 11:59:08  来源:  作者:

给你一个装满水的 8 升满壶和两个分别是 5 升、3 升的空壶,请想个优雅的办法,使得其中一个水壶恰好装 4 升水,每一步的操作只能是倒空或倒满。

算法面试 - 水壶问题

 

  • 手动推算每种情况

每走一步,杯中不重复的状态变化

算法面试 - 水壶问题

 

  • 实现代码
import JAVA.util.ArrayList;
import java.util.List;

// 水壶问题
public class Kettle {
    private static class Status {
        int[] kettles = new int[3];

        Status(int k0, int k1, int k2) {
            kettles[0] = k0;
            kettles[1] = k1;
            kettles[2] = k2;
        }
        Status(Status status) {
            kettles[0] = status.kettles[0];
            kettles[1] = status.kettles[1];
            kettles[2] = status.kettles[2];
        }

        public boolean isSuccess(int code) {
            return kettles[0] == code || kettles[1] == code || kettles[2] == code;
        }

        @Override
        public boolean equals(Object obj) {
            Status status = (Status) obj;
            return kettles[0] == status.kettles[0] && kettles[1] == status.kettles[1] && kettles[2] == status.kettles[2];
        }
    }

    static int successCode = 4;                                     // 最终需要包含的状态
    static int[] capitals = {8, 5, 3};                              // 水壶容量
    static Status initStatus = new Status(8, 0, 0);                 // 初始值
    static List<Status> statuses = new ArrayList<Status>() {{       // 初始数组
        add(new Status(initStatus));
    }};
    static List<List<Status>> results = new ArrayList<>();          // 结果数组

    static void iterate(Status status, List<Status> statuses) {
        if (status.isSuccess(successCode)) {
            results.add(new ArrayList<>(statuses));
            return;
        }
        for (int i = 0; i < capitals.length; i++) {
            for (int j = 0; j < capitals.length; j++) {
                if (i == j) continue;
                if (status.kettles[i] == 0 || status.kettles[j] == capitals[j]) continue;
                int difference = Math.min(status.kettles[i], capitals[j] - status.kettles[j]);
                status.kettles[i] -= difference;
                status.kettles[j] += difference;
                if (!statuses.contains(status)) {
                    statuses.add(new Status(status));
                    iterate(status, statuses);
                    statuses.remove(status);
                }
                status.kettles[i] += difference;
                status.kettles[j] -= difference;
            }
        }
    }

    public static void main(String[] args) {
        iterate(initStatus, statuses);
        System.out.println("结果数量:" + results.size());
        results.forEach(statuses -> {
            statuses.forEach(status -> System.out.print(" -> " + status.kettles[0] + ", " + status.kettles[1] + ", " + status.kettles[2]));
            System.out.println();
        });
    }
}

 


Tags:算法面试   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言科普:什么是滑动窗口算法滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动...【详细内容】
2021-01-15  Tags: 算法面试  点击:(147)  评论:(0)  加入收藏
PHP近期常见算法面试题面试的时候会经常问到一些算法题,算法题的考察主要考察的是基础知识的掌握程度和逻辑思考能力以及学习能力的考察,所以什么样的算法题是容易考到的呢?一...【详细内容】
2020-08-10  Tags: 算法面试  点击:(231)  评论:(0)  加入收藏
给你一个装满水的 8 升满壶和两个分别是 5 升、3 升的空壶,请想个优雅的办法,使得其中一个水壶恰好装 4 升水,每一步的操作只能是倒空或倒满。 手动推算每种情况每走一步,杯中...【详细内容】
2020-03-17  Tags: 算法面试  点击:(163)  评论:(0)  加入收藏
▌简易百科推荐
毕业后不重视自己的档案,等到考研、考编、考公务员、单位入职等需要用到档案时,才想起来查询自己的档案。但是,很多人查询档案没有经验,不知道该从何查起。下面给大家介绍查询个...【详细内容】
2021-12-23  帮帮团人力资源    Tags:个人档案   点击:(14)  评论:(0)  加入收藏
评职称可谓是工程人事业发展中的一件大事了,可以说一般想要在行业中持续地、更好地发展的人都会选择评个中级职称! 怎么评广东省建筑中级职称? 在评审时工程业绩最为重要。那...【详细内容】
2021-12-23  资深职称老师—小丽    Tags:职称   点击:(4)  评论:(0)  加入收藏
职场中,事情做得漂亮,不一定结局漂亮;但是善于谋人,把人打通了,出手一般就是巅峰。人情社会尤其如此,说到底工作是人定的,好不好也是人说的,有人为你说话,你就是能力强。没人看到你,工...【详细内容】
2021-12-22  胖子说职场经验    Tags:职场   点击:(4)  评论:(0)  加入收藏
一、在国企,能改变命运的只有你自己。你想改变,就总有办法。你认命,就不要埋怨命运不公。多少领导一样是从基层爬上去的。也许你会说,他们背后有人。我也不反对,但总有那么20%左...【详细内容】
2021-12-21  职场真谛    Tags:国企   点击:(6)  评论:(0)  加入收藏
又到年底了,有更好的工作选择?想跳槽?社保咋处理?以及社保需要注意的小问题是什么?一文全理清!一、打工人离职手册之社保全指南 二、需要注意的社保小问题 ...【详细内容】
2021-12-17  恒企会计网校    Tags:离职指南   点击:(6)  评论:(0)  加入收藏
在个案辅导中,也经常遇到公务员面试前的准备和辅导。首先,我其实挺想吐槽公考的笔试和考试机制的,让我先一吐为快。公务员考察的面非常多,从表达能力这种表面的,到价值观这种底层...【详细内容】
2021-12-14  为好优姐姐    Tags:公务员面试   点击:(12)  评论:(0)  加入收藏
公务员面试形式进行了创新,增加了结构化小组面试这一形式,在结构化的基础上增加了考试互评和回应的环节,这一改变增加了考试难度,也给许多考试造成了困惑,那今天就结构化小组的点...【详细内容】
2021-12-14  红河华图教育    Tags:公务员面试   点击:(14)  评论:(0)  加入收藏
在各级党政机构之中,我们经常会听到一个称呼&mdash;&mdash;“常务副职”,例如县政府有常务副县长,组织部有常务副部长等等。其实,常务副职只是一个约定俗成的简称,其准确名称叫做...【详细内容】
2021-12-14  瑛杰小猪  今日头条  Tags:常务副职   点击:(20)  评论:(0)  加入收藏
在职场,什么都可以没有,就是不能没有情商。没有情商的人,在职场注定难成大器。人际关系搞不定,说话口无遮拦,为人处世更是不够圆滑,处处受限,处处是破绽。尤其是和领导相处,连对方的...【详细内容】
2021-12-14  第一桶金学派    Tags:领导   点击:(8)  评论:(0)  加入收藏
在职场,除了个人的工作能力以外,还要学会去不断的积累自己的人际关系。因为有了关系,就有了渠道,有了机会,有了方法,有了财富&hellip;&hellip;越是和厉害的人交往,你自己也会变得越...【详细内容】
2021-12-10  第一桶金学派    Tags:职场   点击:(12)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条