华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
考古问题,假设以前的石碑被打碎成了很多块,每块上面都有一个或若干个字符,请你写个程序来把之前石碑上文字可能的组合全部写出来,按升序进行排列。
二、输入描述
若干个字符。
三、输出描述
把之前石碑上文字可能的组合全部写出来,按升序进行排列。
四、测试用例
1、输入
3
a b c
2、输出
abc
acb
bac
bca
cab
cba
五、解题思路
- 把之前石碑上文字可能的组合全部写出来,按升序进行排列;
- 定义可能的组合lists;
- 通过回溯寻找符合要求的字符串,参数为若干个字符arr、字符是否使用过used、遍历到第j个字符、使用了的字母deque);
六、Python算法源码
import sys
def dfs(arr, used, path, result):
if len(path) == len(arr):
result.append(''.join(path))
return
for i in range(len(arr)):
if used[i]:
continue
if i > 0 and arr[i] == arr[i - 1] and not used[i - 1]:
continue
used[i] = True
path.append(arr[i])
dfs(arr, used, path, result)
path.pop()
used[i] = False
def main():
# 读取输入
n = int(sys.stdin.readline())
arr = sys.stdin.readline().strip().split()
arr.sort()
used = [False] * n
result = []
dfs(arr, used, [], result)
# 输出结果
for perm in result:
print(perm)
if __name__ == "__main__":
main()
七、JavaScript算法源码
function dfs(arr, used, path, result) {
if (path.length === arr.length) {
result.push(path.join(''));
return;
}
for (let i = 0; i < arr.length; i++) {
if (used[i]) continue;
if (i > 0 && arr[i] === arr[i - 1] && !used[i - 1]) continue;
used[i] = true;
path.push(arr[i]);
dfs(arr, used, path, result);
path.pop();
used[i] = false;
}
}
function main() {
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
const n = parseInt(input[0]);
let arr = input[1].split(' ');
arr.sort();
let used = new Array(n).fill(false);
let result = [];
dfs(arr, used, [], result);
for (let perm of result) {
console.log(perm);
}
}
main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
char arr[MAX][2];
int used[MAX];
char path[MAX];
int n;
char result[MAX][MAX];
int count = 0;
// 比较函数,用于排序
int cmp(const void *a, const void *b) {
return strcmp((char*)a, (char*)b);
}
void dfs(char arr[][2], int used[], char path[], int depth) {
if (depth == n) {
path[depth] = '\0';
strcpy(result[count++], path);
return;
}
for(int i = 0; i < n; i++) {
if (used[i]) continue;
if(i > 0 && strcmp(arr[i], arr[i-1]) == 0 && !used[i-1]) continue;
used[i] = 1;
path[depth] = arr[i][0];
dfs(arr, used, path, depth + 1);
used[i] = 0;
}
}
int main(){
// 读取输入
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf(" %s", arr[i]);
}
// 排序
qsort(arr, n, sizeof(arr[0]), cmp);
memset(used, 0, sizeof(used));
dfs(arr, used, path, 0);
// 输出结果
for(int i = 0; i < count; i++) {
printf("%s\n", result[i]);
}
return 0;
}
九、C++算法源码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<string> arr(n);
for(auto &s : arr) cin >> s;
sort(arr.begin(), arr.end());
vector<bool> used(n, false);
string path;
vector<string> result;
// 回溯函数
function<void()> dfs = [&](void) {
if(path.length() == n){
result.push_back(path);
return;
}
for(int i = 0; i < n; i++){
if(used[i]) continue;
if(i > 0 && arr[i] == arr[i-1] && !used[i-1]) continue;
used[i] = true;
path += arr[i];
dfs();
path.pop_back();
used[i] = false;
}
};
dfs();
for(auto &s : result) cout << s << "\n";
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。