Задача из интервью.Как бы мы это решили? - PullRequest
0 голосов
/ 19 февраля 2019

Преобразовать строку таким образом

let initialString = "atttbcdddd"
// result must be like this "at3bcd4"

Но повторение должно быть больше 2. Например, если у нас есть «аа», результатом будет «аа», но если у нас есть «ааа»,результат будет "a3"

Еще один пример:

let str = "aahhhgggg"
//result "aah3g4"

Моя попытка:

func encrypt(_ str: String) -> String {

    let char = str.components(separatedBy: "t") //must input the character
    var count = char.count - 1
    var string = ""
    string.append("t\(count)")
    return string
}

Если я введу "ttttt", он вернет "t5"но я должен ввести символ

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019

Используйте уменьшить здесь.

func exp(_ s : String, _ term: String) -> String{ //term_inator: Any Char not in the Sequence.

guard let first = s.first  else {return ""}

return """
\(s.dropFirst().appending(term).reduce(("\(first)",1)){ r, c in
let t = c == r.0.last!
let tc =  t  ? r.1 : 0
let tb =  t  ? ""  : "\(c)"
let ta =  t  ? ""  :   r.1 > 2 ? "\(r.1)"  : r.1 == 2 ?  "\(r.0.last!)" : ""
return (r.0 + ta + tb, tc + 1)
}.0.dropLast())
"""}

print(exp(initialString, " "))

let initialString = "abbbaaa" // ab3a3
let initialString = "aahhhgggg" // aah3g4
let initialString = "aabbaa" //  aabbaa
0 голосов
/ 19 февраля 2019
let initialString = "atttbcdddd"
let myInitialString = initialString + " "

var currentLetter: Character = " "
var currentCount = 1
var answer = ""

for (_, char) in myInitialString.enumerated(){
    if char == currentLetter {
        currentCount += 1
    } else {
        if currentCount > 1 {
            answer += String(currentCount)
        }
        answer += String(char)
        currentCount = 1
        currentLetter = char
   }
}
print(answer)
0 голосов
/ 19 февраля 2019

Я пробовал это раньше для одного из интервью, а также думаю, что вы тоже :).Тем не менее, очень простой способ сделать это просто пройти шаг за шагом кода.

let initialString = "atttbcdddd"
var previousChar: Character = " "
var output = ""
var i = 1 // Used to count the repeated charaters
var counter = 0 // To check the last character has been reached

//Going through each character
for char in initialString {

    //Increase the characters counter to check the last element has been reached. If it is, add the character to output.
    counter += 1
    if previousChar == char { i += 1 }
    else {
        output = output + (i == 1 ? "\(previousChar)" : "\(previousChar)\(i)")
        i = 1
    }
    if initialString.count == counter {
        output = output + (i == 1 ? "\(previousChar)" : "\(previousChar)\(i)")
    }
    previousChar = char
}
let finalOutput = output.trimmingCharacters(in: .whitespacesAndNewlines)
print(finalOutput)
0 голосов
/ 19 февраля 2019

То, что вы ищете, это «Длина кодирования» .Обратите внимание, что это , а не шифрование!

Вот возможная реализация (пояснения приведены в строке):

func runLengthEncode(_ str: String) -> String {
    var result = ""
    var pos = str.startIndex // Start index of current run
    while pos != str.endIndex {
        let char = str[pos]
        // Find index of next run (or `endIndex` if there is none):
        let next = str[pos...].firstIndex(where: { $0 != char }) ?? str.endIndex
        // Compute the length of the current run:
        let length = str.distance(from: pos, to: next)
        // Append compressed output to the result:
        result.append(length <= 2 ? String(repeating: char, count: length) : "\(char)\(length)")
        pos = next // ... and continue with next run
    }
    return result
}

Примеры:

print(runLengthEncode("atttbcdddd")) // at3bcd4
print(runLengthEncode("aahhhgggg"))  // aah3g4
print(runLengthEncode("abbbaaa"))    // ab3a3
0 голосов
/ 19 февраля 2019

Оформить заказ:

func convertString(_ input : String) -> String {
    let allElements = Array(input)
    let uniqueElements = Array(NSOrderedSet(array: allElements)) as! [Character]
    var outputString = ""

    for uniqueChar in uniqueElements  {
        var count = 0
        for char in allElements {
            if char == uniqueChar {
                count+=1
            }
        }
        if count > 2 {
            outputString += "\(uniqueChar)\(count)"
        } else if count == 2 {
            outputString += "\(uniqueChar)\(uniqueChar)"
        } else {
            outputString += "\(uniqueChar)"
        }
    }
    return outputString
}

Вход : convertString("atttbcdddd")

Выход : at3bcd4

...