跳到主要内容

1033.移动石子直到连续

链接:1033.移动石子直到连续
难度:Medium
标签:脑筋急转弯、数学
简介:三枚石子放置在数轴上,位置分别为 a,b,c。使游戏结束,你可以执行的最小和最大移动次数分别是多少?。

题解 1 - cpp

  • 编辑时间:2023-04-30
  • 内存消耗:6.1MB
  • 编程语言:cpp
  • 解法介绍:贪心,先排序,最大数就是ac一步步往b靠,最小数是如果有两个数紧挨或者两个数中间空一格,那就可以一步到位,否则需要两步。
void sort3(int &a, int &b, int &c) {
if (a > c) swap(a, c);
if (a > b) swap(a, b);
if (b > c) swap(b, c);
}
class Solution {
public:
vector<int> numMovesStones(int a, int b, int c) {
sort3(a, b, c);
vector<int> res(2, 0);
if (a + 2 == c) return res;
res[0] = a + 1 == b || b + 1 == c || a + 2 == b || b + 2 == c ? 1 : 2;
res[1] = c - b - 1 + b - a - 1;
return res;
}
};

题解 2 - python

  • 编辑时间:2023-04-30
  • 执行用时:36ms
  • 内存消耗:16.1MB
  • 编程语言:python
  • 解法介绍:同上。
def sort3(a: int, b: int, c: int) -> Tuple[int, int, int]:
if a > c:
a, c = c, a
if a > b:
a, b = b, a
if b > c:
b, c = c, b
return (a, b, c)

class Solution:
def numMovesStones(self, a: int, b: int, c: int) -> List[int]:
a, b, c = sort3(a, b, c)
if a + 2 == c:
return [0, 0]
return [
1 if a + 1 == b or b + 1 == c or a + 2 == b or b + 2 == c else 2,
c - b - 1 + b - a - 1
]

题解 3 - rust

  • 编辑时间:2023-04-30
  • 内存消耗:1.9MB
  • 编程语言:rust
  • 解法介绍:同上。
fn sort3(a: &mut i32, b: &mut i32, c: &mut i32) {
use std::ptr::swap;
unsafe {
if a > c {
swap(a, c);
}
if a > b {
swap(a, b);
}
if b > c {
swap(b, c);
}
};
}
impl Solution {
pub fn num_moves_stones(mut a: i32, mut b: i32, mut c: i32) -> Vec<i32> {
sort3(&mut a, &mut b, &mut c);
if a + 2 == c {
vec![0, 0]
} else {
vec![
if a + 1 == b || b + 1 == c || a + 2 == b || b + 2 == c {
1
} else {
2
},
c - b - 1 + b - a - 1,
]
}
}
}