-
Notifications
You must be signed in to change notification settings - Fork 24
/
1033-moving-stones-until-consecutive.js
70 lines (59 loc) · 1.97 KB
/
1033-moving-stones-until-consecutive.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 1033. Moving Stones Until Consecutive
// Easy 39%
// 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 3:
// 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
/**
* @param {number} a
* @param {number} b
* @param {number} c
* @return {number[]}
*/
const numMovesStones = function(a, b, c) {
[a, b, c] = [a, b, c].sort((a, b) => a - b)
let min = 2, p = b - a, q = c - b
if (p === 1 && q === 1) min = 0
else if (p === 1 || q === 1 || p === 2 || q === 2) min = 1
return [min, c - a - 2]
}
;[
[1, 2, 5], // [1,2]
[4, 3, 2], // [0,0]
[3, 5, 1], // [1,2]
[5, 1, 10], // [2,7]
].forEach(([a, b, c]) => {
console.log(numMovesStones(a, b, c))
})
// Solution:
// 假设 a < b < c
// 最大移动值为 c - a - 2
// 最小移动值为
// 1) b - a = 1 && c - b = 1, 0
// 2) b - a = 1 || c - b = 1 || b - a = 2 || c - b = 2, 1
// 3) 2
// Submission Result: Accepted