753. Cracking the Safe
Имеется сейф, защищенный паролем. Пароль представляет собой последовательность из n цифр, каждая из которых может находиться в диапазоне [0, k - 1]. Сейф имеет особый способ проверки пароля. НаVí dụ, правильный пароль - "345", а вы вводите "012345": после ввода 0 последние 3 цифры - "0", что неверно. После ввода 1 последние 3 цифры - "01", что неверно. После ввода 2 последние 3 цифры - "012", что неверно.
После ввода 3 последние 3 цифры - "123", что неверно. После ввода 4 последние 3 цифры - "234", что неверно. После ввода 5 последние 3 цифры - "345", что верно, и сейф разблокируется. return любую строку минимальной длины, которая разблокирует сейф на определенном этапе ввода.
Ví dụ:
Input: n = 1, k = 2
Output: "10"
C# lời giải
đã khớp/gốcusing System.Collections.Generic;
using System.Text;
public class Solution {
public string CrackSafe(int n, int k) {
var seen = new HashSet<string>();
var result = new StringBuilder();
string startNode = new string('0', n - 1);
Dfs(startNode, k, seen, result);
result.Append(startNode);
return result.ToString();
}
private void Dfs(string node, int k, HashSet<string> seen, StringBuilder result) {
for (int x = 0; x < k; x++) {
string neighbor = node + x;
if (!seen.Contains(neighbor)) {
seen.Add(neighbor);
Dfs(neighbor.Substring(1), k, seen, result);
result.Append(x);
}
}
}
}
C++ lời giải
bản nháp tự động, xem lại trước khi gửi#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public string CrackSafe(int n, int k) {
var seen = new HashSet<string>();
var result = new StringBuilder();
string startNode = new string('0', n - 1);
Dfs(startNode, k, seen, result);
result.Append(startNode);
return result.ToString();
}
private void Dfs(string node, int k, HashSet<string> seen, StringBuilder result) {
for (int x = 0; x < k; x++) {
string neighbor = node + x;
if (!seen.Contains(neighbor)) {
seen.push_back(neighbor);
Dfs(neighbor.Substring(1), k, seen, result);
result.Append(x);
}
}
}
}
Java lời giải
đã khớp/gốcimport java.util.HashSet;
import java.util.Set;
public class Solution {
public String crackSafe(int n, int k) {
Set<String> seen = new HashSet<>();
StringBuilder result = new StringBuilder();
String startNode = "0".repeat(n - 1);
dfs(startNode, k, seen, result);
result.append(startNode);
return result.toString();
}
private void dfs(String node, int k, Set<String> seen, StringBuilder result) {
for (int x = 0; x < k; x++) {
String neighbor = node + x;
if (!seen.contains(neighbor)) {
seen.add(neighbor);
dfs(neighbor.substring(1), k, seen, result);
result.append(x);
}
}
}
}
JavaScript lời giải
đã khớp/gốcvar crackSafe = function(n, k) {
const seen = new Set();
const result = [];
const dfs = (node) => {
for (let x = 0; x < k; x++) {
const neighbor = node + x;
if (!seen.has(neighbor)) {
seen.add(neighbor);
dfs(neighbor.slice(1));
result.push(x);
}
}
};
const startNode = '0'.repeat(n - 1);
dfs(startNode);
return startNode + result.join('');
};
Python lời giải
đã khớp/gốcdef crackSafe(n, k):
seen = set()
result = []
def dfs(node):
for x in range(k):
neighbor = node + str(x)
if neighbor not in seen:
seen.add(neighbor)
dfs(neighbor[1:])
result.append(str(x))
start_node = '0' * (n - 1)
dfs(start_node)
return start_node + ''.join(result)
Go lời giải
đã khớp/gốcpackage main
import (
"fmt"
"strings"
)
func crackSafe(n int, k int) string {
seen := make(map[string]bool)
var result []byte
startNode := strings.Repeat("0", n-1)
dfs(startNode, k, seen, &result)
result = append(result, startNode...)
return string(result)
}
func dfs(node string, k int, seen map[string]bool, result *[]byte) {
for x := 0; x < k; x++ {
neighbor := node + fmt.Sprint(x)
if !seen[neighbor] {
seen[neighbor] = true
dfs(neighbor[1:], k, seen, result)
*result = append(*result, byte(x+'0'))
}
}
}
Algorithm
Создайте đồ thị, где каждая vertex представляет собой строку длины n-1, а каждое edge между двумя vertexми представляет собой добавление одной из цифр из диапазона [0, k-1].
Используйте Thuật toán Эйлерова пути или цикла для нахождения пути, который проходит через каждое edge ровно один раз.
Составьте итоговую строку, которая включает начальную вершину и все добавленные цифры.
😎
Vacancies for this task
việc làm đang hoạt động with overlapping task tags are đã hiển thị.