华为OD 第k个排序

题目描述

给定参数 n,从 1 到 n 会有 n 个整数:1,2,3,…,n, 这 n 个数字共有 n! 种排列。

按大小顺序升序列出所有排列的情况,并一一标记,当 n = 3 时,所有排列如下:

  • “123”
  • “132”
  • “213”
  • “231”
  • “312”
  • “321”

给定 n 和 k,返回第 k 个排列。

输入描述

输入两行,第一行为 n,第二行为 k,

给定 n 的范围是[1, 9], 给定 k 的范围是[1, n!]。

输出描述

输出排在第 k 位置的数字。

用例1

输入

3
3

输出

213

说明

3的排列有123,132,213…,那么第三位置就是213

用例2

输入

2
2

输出

21

说明

2的排列有12,21,那么第二位置的为21。

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    static Map<Integer, Integer> map = new HashMap<Integer, Integer>();

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        func(9);
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }
        StringBuilder builder = new StringBuilder();
        while (k % map.get(n - 1) != 0) {
            int num = k / map.get(n - 1);
            builder.append(list.get(num));
            list.remove(num);
            k = k % map.get(n - 1);
            n = n - 1;
        }
        int num = k / map.get(n - 1);
        builder.append(list.get(num - 1));
        list.remove(num - 1);
        if (list.size() > 0) {
            list.sort((a,b) -> b.compareTo(a));
            list.forEach(e-> {
                builder.append(e);
            });
        }
        System.out.println(builder.toString());

    }

    public static int func(int n) {
        if (n == 1) {
            map.put(1, 1);
            return 1;
        }
        if (map.get(n) != null) {
            return map.get(n);
        }
        map.put(n, n * func(n - 1));
        return n * func(n - 1);
    }
}

 

### 华为OD项目字符串重新排序算法实现 #### 算法概述 对于华为OD项目的字符串重新排序问题,其核心目标是对输入字符串中的单词按照特定规则进行重排。具体而言,需要完成两个主要操作: 1. **单词内部调整**:对每个单词内的字符按字典序排序[^3]。 2. **单词间顺序调整**:基于以下优先级对单词进行排序: - 按照单词出现的次数降序排列; - 如果次数相同,则按照单词长度升序排列; - 若次数和长度都相同,则按照字典序升序排列。 以下是具体的实现逻辑及其代码示例: --- #### 实现细节 ##### 1. 数据预处理 首先,将输入字符串分割成单独的单词列表,并去除多余的空格。这可以通过编程语言内置的字符串分割函数来实现,例如 Python 的 `split()` 方法[^4]。 ##### 2. 单词内部调整 通过排序算法对每个单词的字符进行字典序排序。可以利用标准库中的排序功能,如 Python 中的 `sorted()` 函数。 ##### 3. 构建映射关系 为了统计单词出现的频率并记录其他属性(如长度),可构建一个数据结构存储这些信息。通常使用哈希表(字典)来高效管理键值对。 ##### 4. 排序规则应用 根据题目要求定义多层排序规则,并将其应用于最终的结果集合。大多数现代编程语言支持自定义比较器作为参数传递给排序函数,从而简化复杂排序逻辑的实现。 --- #### 示例代码 (Python) 下面提供了一个完整的 Python 实现方案: ```python from collections import Counter, defaultdict def rearrange_string(s): # Step 1: Split the string into words and normalize them by sorting characters within each word. words = s.split() normalized_words = [''.join(sorted(word)) for word in words] # Step 2: Count occurrences of each unique sorted word. count_map = Counter(normalized_words) # Step 3: Create a list with additional attributes for sorting purposes. sortable_list = [] for word in set(normalized_words): # Use only distinct words to avoid duplicates after counting. frequency = count_map[word] length = len(word) sortable_list.append((frequency, length, word)) # Step 4: Sort based on given criteria. # Primary key: descending order of frequency (-frequency). # Secondary key: ascending order of length (+length). # Tertiary key: lexicographical order (+word). sortable_list.sort(key=lambda x: (-x[0], x[1], x[2])) # Step 5: Reconstruct result as space-separated string from sorted tuples' third element. result = ' '.join([item[2] for item in sortable_list]) return result # Example usage: input_str = "This is an apple" output_str = rearrange_string(input_str) print(output_str) # Expected Output: "an is This aelpp" ``` 上述代码实现了整个流程,包括但不限于单词拆分、字符排序、频次计算以及多重条件下的排序过程。 --- #### 复杂度分析 - 时间复杂度:假设 n 表示总字符数,m 是平均单词长度,则时间复杂度大致为 O(n log m),其中大部分开销来自单个单词内字符的排序操作。 - 空间复杂度:由于额外创建了多个辅助数组与计数器对象,因此空间需求约为 O(k),k 代表不同规范化单词的数量。 --- #### 注意事项 在实际开发过程中需要注意边界情况测试,比如全为空白符的情况或者仅含特殊符号的情形等。此外还需考虑大小写敏感与否等因素的影响[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值