482. License Key Formatting
leetcode easy
Task
Вам дан лицензионный ключ, представленный в виде строки s, которая состоит только из буквенно-цифровых символов и тире. Строка разделена на n + 1 групп с помощью n тире. Вам также дано целое число k.
Мы хотим переформатировать строку s так, чтобы каждая группа содержала ровно k символов, за исключением первой группы, которая может быть короче k, но все же должна содержать хотя бы один символ. Кроме того, между двумя группами должно быть вставлено тире, и все строчные буквы следует преобразовать в прописные.
Верните переформатированный лицензионный ключ.
Пример:
Input: s = "5F3Z-2e-9-w", k = 4
Output: "5F3Z-2E9W"
Explanation: The string s has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.
C# solution
matched/originalpublic class Solution {
public string LicenseKeyFormatting(string s, int k) {
int count = 0;
var ans = new StringBuilder();
for (int i = s.Length - 1; i >= 0; i--) {
if (s[i] != '-') {
ans.Append(char.ToUpper(s[i]));
count++;
if (count == k) {
ans.Append('-');
count = 0;
}
}
}
if (ans.Length > 0 && ans[ans.Length - 1] == '-') {
ans.Length--;
}
var arr = ans.ToString().ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}C++ solution
auto-draft, review before submit#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 LicenseKeyFormatting(string s, int k) {
int count = 0;
var ans = new StringBuilder();
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] != '-') {
ans.Append(char.ToUpper(s[i]));
count++;
if (count == k) {
ans.Append('-');
count = 0;
}
}
}
if (ans.size() > 0 && ans[ans.size() - 1] == '-') {
ans.size()--;
}
var arr = ans.ToString().ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}Java solution
matched/originalclass Solution {
public String licenseKeyFormatting(String s, int k) {
int count = 0;
StringBuilder ans = new StringBuilder();
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) != '-') {
ans.append(Character.toUpperCase(s.charAt(i)));
count++;
if (count == k) {
ans.append('-');
count = 0;
}
}
}
if (ans.length() > 0 && ans.charAt(ans.length() - 1) == '-') {
ans.deleteCharAt(ans.length() - 1);
}
return ans.reverse().toString();
}
}JavaScript solution
matched/originalvar licenseKeyFormatting = function(s, k) {
let count = 0;
let ans = [];
for (let i = s.length - 1; i >= 0; i--) {
if (s[i] !== '-') {
ans.push(s[i].toUpperCase());
count++;
if (count === k) {
ans.push('-');
count = 0;
}
}
}
if (ans.length > 0 && ans[ans.length - 1] === '-') {
ans.pop();
}
return ans.reverse().join('');
};Python solution
matched/originalclass Solution:
def licenseKeyFormatting(self, s: str, k: int) -> str:
count = 0
ans = []
for char in reversed(s):
if char != '-':
ans.append(char.upper())
count += 1
if count == k:
ans.append('-')
count = 0
if ans and ans[-1] == '-':
ans.pop()
return ''.join(reversed(ans))Go solution
matched/originalpackage main
import (
"strings"
"unicode"
)
func licenseKeyFormatting(s string, k int) string {
count := 0
var ans strings.Builder
for i := len(s) - 1; i >= 0; i-- {
if s[i] != '-' {
ans.WriteByte(byte(unicode.ToUpper(rune(s[i]))))
count++
if count == k {
ans.WriteByte('-')
count = 0
}
}
}
res := ans.String()
if len(res) > 0 && res[len(res)-1] == '-' {
res = res[:len(res)-1]
}
runes := []rune(res)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}Explanation
Algorithm
Инициализация
Установите count в 0 для подсчета символов в текущей группе. Установите ans в пустую строку для хранения конечного результата.
Итерация по входной строке в обратном порядке
Пропускайте символы '-'. Если текущий символ не '-', добавьте его в ans и увеличьте count на 1. Если count достигает k, добавьте '-' в ans и сбросьте count.
Завершение
Проверьте, есть ли в конце строки ans тире, и удалите его, если оно есть. Переверните строку ans и верните её.
😎