【华为OD】C卷200分真题:100%通过 考古学家 JS实现 【源码+思路】

 C++实现:

【华为OD】C卷200分真题:100%通过 考古学家 C/C++实现 【源码+思路】_考古学家】有一个考古学家发现一个石碑,但是很可惜,发现时其已经断成多段,原地发-CSDN博客

python代码实现:

【华为OD】C卷200分真题:100%通过 考古学家 Python实现 【源码+思路】-CSDN博客

java代码实现:

【华为OD】C卷200分真题:100%通过 考古学家 Java实现 【源码+思路】-CSDN博客

C语言实现:

【华为OD】C卷200分真题:100%通过 考古学家 C语言源码实现 【源码+思路】-CSDN博客

题目描述:

有一个考古学家发现一个石碑,但是很可惜,发现时其已经断成多段,原地发现n个断口整齐的石碑碎片。为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?

输入描述

第一行输入n,n表示石碑碎片的个数。

第二行依次输入石碑碎片上的文字内容s,共有n组。    

输出描述

输出石碑文字的组合(按照升序排列),行末无多余空格。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3
a b c

输出

abc
acb
bac
bca
cab
cba

说明

当石碑碎片上的内容为“a”,“b”,“c”时,则组合有“abc”,“acb”,“bac”,“bca”,“cab”,“cba”

示例2

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3
a b a

输出

aab
aba
baa

说明

当石碑碎片上的内容为“a”,“b”,“a”时,则可能的组合有“aab”,“aba”,“baa”

示例3

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3
a b ab

输出

aabb
abab
abba
baab
baba

说明

当石碑碎片上的内容为“a”,“b”,“ab”时,则可能的组合有“aabb”,“abab”,“abba”,“baab”,“baba”

备注

如果存在石碑碎片内容完全相同,则由于碎片间的顺序变换不影响复原后的碑文内容,即相同碎片间的位置变换不影响组合。

     5                                                          
                                                            
              +---+                                               
              |   |                                               
              |   | 3                       3                                                 |---|
              |   |                                                                           |   |
              |   +---+                   -----                  + ---+                       |   |
              | +      |       |            |   |                  +     |----|3              |   |
  +         2 | +      |       |          2 |   |     2            +     |    |               |   |
  +           | +      |       |            |   |                  +     |    |               |   |
  +       +---+ +      |       |        ----+   |   +---+          +     |    |               |   |
  +       |     +      |       |        |       |   |   |          +     |    |    ++++++|    |   |
  +     1 |     +      | 1     |      1 |       | 1 |   | 1        +     |    |    |     |    |   |
  +       |     +      |       |        |       |   |   |          +     |    |    |     |    |   |
  +   +---+     +      +---+   |    +---+       +---+   +---+      +     |    |    |     |    |   |
  +   |         +          |   |    |                       |      +     |    |    |     |    |   |
  + 0 |         +          | 0 |  0 |                       | 0    +     |    |    |     |    |   |
  +   |         +          |   |    |                       |      +     |    |    |     |    |   |
  +---+         +          +-------+                       +---+  +  +--- |    |+   |     |++ |   |+
                +                                                      
    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14   15  16  17  18 19  20  21
 

题目解析:

        按全排列配合集合来去重即可,最后每个转成字符串输出。C++的set默认就是升序排列的。

JS代码实现:


const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

function nextPermutation(vec, res,n,resSet) {
  if (res.length === n) {
      resSet.add(res.join(''));
  } else {
      for (let i = 0; i < vec.length; i++) {
          const firstElem = vec[i];
          const rest = vec.slice(0, i).concat(vec.slice(i + 1));
          res.push(firstElem);
          nextPermutation(rest, res,n,resSet);
          res.pop();
      }
  }
}

async function main(){

  let num = parseInt(await readline())
  let vec = (await readline()).split(' ');

  if (vec.length === num) {
    vec.sort();
    const res = [];
    n = vec.length;
    resSet = new Set();
    nextPermutation(vec,res,n,resSet);
    for (let s of resSet) {
        console.log(s);
    }
  }

}

main();

【华为OD】C卷200分真题:100%通过 考古学家 JS实现 【源码+思路】_第1张图片

你可能感兴趣的:(杂谈,java,开发语言,华为od,c++,javascript,c语言,python)