← Static tasks

482. License Key Formatting

leetcode easy

#array#csharp#easy#leetcode#string

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/original
public 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/original
class 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/original
var 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/original
class 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/original
package 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 и верните её.

😎