青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

39 阅读2分钟

问题描述

小C定义了一个排列是优美的,当且仅当对于任意的 𝑖∈[1,𝑛]i∈[1,n],都满足 𝑎𝑎𝑖=𝑛−𝑎𝑖+1aai​​=n−ai​+1,其中 𝑛n 表示排列的长度,𝑎𝑖ai​ 表示排列的第 𝑖i 个元素。她想知道,给定长度为 𝑛n 的排列中,字典序最大的优美排列是什么?

注意,排列的定义为,长度为 𝑛n 的序列中,11 到 𝑛n 都出现且仅出现一次。


测试样例

样例1:

输入:n = 2
输出:[2, 1]

样例2:

输入:n = 4
输出:[4, 3, 2, 1]

样例3:

输入:n = 5
输出:[5, 4, 3, 2, 1]

题解:

为了解决这个问题,我们需要理解小C定义的优美排列的性质。优美排列要求对于排列中的每一个元素 a_i,都满足 a_a_i = n - a_i + 1。这意味着对于排列中的每一个元素 a_i,它在排列中的位置 i 和它对应的值 a_i 之间存在一个特定的关系。

我们可以从排列的末尾开始构建这个排列,因为这样可以确保我们得到的是字典序最大的排列。我们可以按照以下步骤来构建这个排列:

  1. 初始化:我们从排列的末尾开始构建,初始化一个空列表来存储结果。

  2. 构建排列:我们从 n 开始,依次将 n, n-1, ..., 1 添加到列表中。

  3. 验证:在构建过程中,我们需要验证每个元素 a_i 是否满足 a_a_i = n - a_i + 1。由于我们是从 n 开始构建的,并且每个元素都是唯一的,我们可以确保这个条件总是满足的。

以下是解决这个问题的代码:

import java.util.*;

public class Main {
    public static List<Integer> solution(int n) {
        List<Integer> result = new ArrayList<>();
        
        // 从 n 开始,依次将 n, n-1, ..., 1 添加到列表中
        for (int i = n; i >= 1; i--) {
            result.add(i);
        }
        
        return result;
    }

    public static void main(String[] args) {
        System.out.println(solution(2).equals(Arrays.asList(2, 1)));
        System.out.println(solution(4).equals(Arrays.asList(4, 3, 2, 1)));
        System.out.println(solution(5).equals(Arrays.asList(5, 4, 3, 2, 1)));
    }
}

这段代码首先初始化一个空列表 result。然后,它从 n 开始,依次将 n, n-1, ..., 1 添加到列表中。由于我们是从 n 开始构建的,并且每个元素都是唯一的,我们可以确保这个排列满足小C定义的优美排列的性质。最后,它返回结果列表。