樹上交換節點(OPPO23屆秋招-後端真題)

athenanevergiveup發表於2024-04-11

題面

核心思想

這道題跟樹沒有任何關係。。。

樣例的 2 1 4 3 直接在陣列交換為 1 2 3 4 就可以了。
那麼只要當前下標i 與 nums[i] 不相等我們就交換
比如

5 1 2 3 4
1 != 5 交換為 -> 4 1 2 3 5
1 != 4 交換為 -> 3 1 2 4 5
1 != 3 交換為 -> 2 1 3 4 5
1 != 2 交換為 -> 1 2 3 4 5

第3題也很簡單懶得寫了。

程式碼

import java.util.*;

public class Main {
    static final int MAXN = (int) (1e4 + 10);

    public static void main(String[] args) {
        final long MOD = (long) (1e9 + 7);

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n + 1];
        int cnt = 0;
        for(int i = 1; i <= n; i++){
            nums[i] = in.nextInt();
        }
        for(int i = 1;i <= n; i++){
            while(nums[i] != i){
                int tmp = nums[nums[i]];
                nums[nums[i]] = nums[i];
                nums[i] = tmp;
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}

相關文章