1033. Moving Stones Until Consecutive

Three stones are on a number line at positions a, b, and c.

Each turn, you pick up a stone at an endpoint (ie., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints. Formally, let’s say the stones are currently at positions x, y, z with x < y < z. You pick up the stone at either position x or position z, and move that stone to an integer position k, with x < k < z and k != y.

The game ends when you cannot make any more moves, ie. the stones are in consecutive positions.

When the game ends, what is the minimum and maximum number of moves that you could have made? Return the answer as an length 2 array: answer = [minimum_moves, maximum_moves]

Example 1

Input: a = 1, b = 2, c = 5
Output: [1,2]
Explanation: Move the stone from 5 to 3, or move the stone from 5 to 4 to 3.

Example 2

Input: a = 4, b = 3, c = 2
Output: [0,0]
Explanation: We cannot make any moves.

Example 2

Input: a = 3, b = 5, c = 1
Output: [1,2]
Explanation: Move the stone from 1 to 4; or move the stone from 1 to 2 to 4.

Note

1 <= a <= 100
1 <= b <= 100
1 <= c <= 100
a != b, b != c, c != a

题意 这个题的题意就是把求最小最大的移动步数使得三个石头挨着。 最小的步数,肯定是把两端的石头一步之内移到中间石头的左右两侧。 最大的步数就是一步一步的移过去。 这道题主要是注意一些特殊情况的判断,比如三个石头是否本来就已经挨着了,或者两个石头已经挨着了。

代码

class Solution {
    public int[] numMovesStones(int a, int b, int c) {
        int min = Math.min(Math.min(a, b), c);
        int max = Math.max(Math.max(a, b), c);
        int mid = min ^ a ^ b^c^ max;
        if(max - min == 2) return new int[] {0, 0};
        int retMin = mid - min == 1? 0 : 1;
        retMin += max -mid == 1? 0 : 1;
        if(mid - min == 2 || max - mid == 2 ) retMin = 1;
        int retMax = max - min - 2;
        return new int[]{retMin, retMax};
    }
}

Search

    Table of Contents