解题思路
-
题目要求:
- 给定起始角度
和目标角度
(0-359度)
- 可以顺时针或逆时针旋转
- 需要找到最短旋转路径
- 当两种方向旋转角度相同时,选择顺时针
- 给定起始角度
-
解题策略:
- 比较
和
的大小关系
- 计算顺时针和逆时针两个方向的旋转角度
- 选择较小的角度
- 如果角度相等,选择顺时针方向(正数)
- 比较
代码
#include <iostream>
using namespace std;
int getMinRotation(int n1, int n2) {
if(n1 == n2) return 0;
if(n1 > n2) {
// 计算两个方向的旋转角度
int clockwise = 360 - n1 + n2; // 顺时针
int counterclockwise = -(n1 - n2); // 逆时针
// 选择较小的角度
if(abs(clockwise) < abs(counterclockwise)) {
return clockwise;
} else if(abs(clockwise) > abs(counterclockwise)) {
return counterclockwise;
} else {
return clockwise; // 角度相等时选择顺时针
}
} else {
// n1 < n2
int clockwise = n2 - n1; // 顺时针
int counterclockwise = -(360 - n2 + n1); // 逆时针
if(abs(clockwise) < abs(counterclockwise)) {
return clockwise;
} else if(abs(clockwise) > abs(counterclockwise)) {
return counterclockwise;
} else {
return clockwise; // 角度相等时选择顺时针
}
}
}
int main() {
int n1, n2;
cin >> n1 >> n2;
cout << getMinRotation(n1, n2) << endl;
return 0;
}
import java.util.*;
public class Main {
static int getMinRotation(int n1, int n2) {
if(n1 == n2) return 0;
if(n1 > n2) {
// 计算两个方向的旋转角度
int clockwise = 360 - n1 + n2; // 顺时针
int counterclockwise = -(n1 - n2); // 逆时针
// 选择较小的角度
if(Math.abs(clockwise) < Math.abs(counterclockwise)) {
return clockwise;
} else if(Math.abs(clockwise) > Math.abs(counterclockwise)) {
return counterclockwise;
} else {
return clockwise; // 角度相等时选择顺时针
}
} else {
// n1 < n2
int clockwise = n2 - n1; // 顺时针
int counterclockwise = -(360 - n2 + n1); // 逆时针
if(Math.abs(clockwise) < Math.abs(counterclockwise)) {
return clockwise;
} else if(Math.abs(clockwise) > Math.abs(counterclockwise)) {
return counterclockwise;
} else {
return clockwise; // 角度相等时选择顺时针
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n1 = sc.nextInt();
int n2 = sc.nextInt();
System.out.println(getMinRotation(n1, n2));
}
}
def get_min_rotation(n1, n2):
if n1 == n2:
return 0
if n1 > n2:
# 计算两个方向的旋转角度
clockwise = 360 - n1 + n2 # 顺时针
counterclockwise = -(n1 - n2) # 逆时针
# 选择较小的角度
if abs(clockwise) < abs(counterclockwise):
return clockwise
elif abs(clockwise) > abs(counterclockwise):
return counterclockwise
else:
return clockwise # 角度相等时选择顺时针
else:
# n1 < n2
clockwise = n2 - n1 # 顺时针
counterclockwise = -(360 - n2 + n1) # 逆时针
if abs(clockwise) < abs(counterclockwise):
return clockwise
elif abs(clockwise) > abs(counterclockwise):
return counterclockwise
else:
return clockwise # 角度相等时选择顺时针
n1, n2 = map(int, input().split())
print(get_min_rotation(n1, n2))
算法及复杂度
- 算法:数学计算
- 时间复杂度:
- 只需要简单的数学计算
- 空间复杂度:
- 只需要常数级别的额外空间