前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画:脑筋急转弯算法题目(???)

漫画:脑筋急转弯算法题目(???)

作者头像
程序员小浩
发布2020-03-30 14:32:46
4260
发布2020-03-30 14:32:46
举报
文章被收录于专栏:小浩算法小浩算法

01 PART

移动石

分享这道题目的原因,是因为有很多同学,在拿到题目的一瞬间,如果发现题目很长,然后自己就慌了。其实,对于这种题目,如果认真的分析下去,非常简单。

1033题:三枚石子放置在数轴上,位置分别为 a,b,c。每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。要使游戏结束,你可以执行的最小和最大移动次数分别是多少?以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]

输入:a = 1, b = 2, c = 5

输出:[1, 2]

解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。

示例 2:

输入:a = 4, b = 3, c = 2

输出:[0, 0]

解释:我们无法进行任何移动。

提示:

1 <= a <= 100

1 <= b <= 100

1 <= c <= 100

a != b, b != c, c != a

02 PART

题目分析

这种题,基本上不慌,就赢了一半。

通过分析题中的样例,就算再笨,画一画应该都能理解题意。

比如:a = 1, b = 2, c = 5

比如:a = 4, b = 3, c = 2

(无法移动)

读懂了题意,开始进行分析。首先可以明确,每一次我们其实是从边上来挑选石子,然后往中间进行移动。所以,我们首先得找到min(左),max(右)以及mid(中)三个值。我们设,min和mid中的距离为x,max和min中的距离为y。大概就是下面这样:

然后只需要计算x和y的和,就是我们要找的最大值。而最小值,就很容易了,只有0,1,2三种可能性。

根据分析,得到代码:(本命...Go)

代码语言:javascript
复制
//GO
func numMovesStones(a int, b int, c int) []int {
    arr := []int{a, b, c}
    sort.Ints(arr)
    x := arr[1] - arr[0] - 1
    y := arr[2] - arr[1] - 1
    max := x + y
    min := 0
    if x != 0 || y != 0 {
        if x > 1 && y > 1 {
            min = 2
        } else {
            min = 1
        }
    }
    return []int{min, max}
}

郑重申明(读我的文章必看):

  • 本系列所有教程都不会用到复杂的语言特性,不需要担心没有学过相关语法,使用各语言纯属本人爱好。
  • 作为学术文章,虽然风格可以风趣,但严谨,我是认真的。本文所有代码均在leetcode上进行过测试运行。
  • 算法思想才是最重要的。

03 PART

C++代码

当然,也可以不用排序,把代码写漂亮一点。像是下面这样...

代码语言:javascript
复制
//C++
class Solution {
public:
    vector<int> numMovesStones(int a, int b, int c) {
        int max = a > b ? (a > c ? a : c) : (c > b ? c : b);
        int min = a < b ? (a < c ? a : c) : (b < c ? b : c);
        int med = a + b + c - max - min;
        int maxMove = max - min - 2;
        int minMove = 2;
        if (max - med == 1 && med - min == 1) {
            minMove = 0;
        } else if (max - med == 1 || med - min == 1) {
            minMove = 1;
        } else if (max - med == 2 || med - min == 2) {
            minMove = 1;
        }
        return vector{minMove,maxMove};
    }
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小浩算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档