解题思路

  1. 题目要求:

    • 给定起始角度 和目标角度 (0-359度)
    • 可以顺时针或逆时针旋转
    • 需要找到最短旋转路径
    • 当两种方向旋转角度相同时,选择顺时针
  2. 解题策略:

    • 比较 的大小关系
    • 计算顺时针和逆时针两个方向的旋转角度
    • 选择较小的角度
    • 如果角度相等,选择顺时针方向(正数)

代码

#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))

算法及复杂度

  • 算法:数学计算
  • 时间复杂度: - 只需要简单的数学计算
  • 空间复杂度: - 只需要常数级别的额外空间