Средний персонаж Свифт - PullRequest
0 голосов
/ 17 мая 2019

У меня есть проблема, которую я пытаюсь решить

Я пытаюсь найти средний символ слова.Если длина слова нечетная, верните средний символ.Если длина слова четная, вернуть средние 2 символа

func middle(_ str: String) -> String {
    let arr = Array(str).map{$0}

    print(arr)
//    if arr.count
    for myInt: String in arr {
        if myInt % 2 == 0 {
            println("\(myInt) is even number")
        } else {
            println("\(myInt) is odd number")
        }
    }
    return ""
}

Ответы [ 4 ]

4 голосов
/ 17 мая 2019

Предполагая, что ваша строка является целым словом (в противном случае вам нужно будет перечислить вашу строку byWords перед использованием этого свойства):

extension StringProtocol {
    var middle: SubSequence {
        if isEmpty { return "" }
        if count == 1 { return  self[startIndex...startIndex] }
        let middleIndex = index(startIndex, offsetBy: count/2)
        let previous = index(before: middleIndex)
        return count % 2 == 0 ? self[previous...middleIndex] : self[middleIndex...middleIndex]
    }
}

"abc".middle
"abcd".middle
1 голос
/ 17 мая 2019

Давайте попробуем подойти к этому систематически.Первой задачей было бы определить смещения первого и последнего символа «средней части».Если мы составим таблицу с некоторыми репрезентативными случаями

string  result  length  first   last
------------------------------------
a       a       1       0       0
ab      ab      2       0       1
abc     b       3       1       1
abcd    bc      4       1       2
abcde   c       5       2       2
abcdef  cd      6       2       3

, то получим, что

firstIndex = (length - 1) / 2
lastIndex = length / 2

, где / - это усеченное целочисленное деление .Пустая строка должна обрабатываться отдельно.

Наконец, нам нужно знать, как работать с индексами и смещениями в строке Swift, что объясняется в Новая модель для коллекций и индексов .

Это приводит к реализации

func middle(_ str: String) -> String {
    if str.isEmpty { return "" }
    let len = str.count
    let fromIdx = str.index(str.startIndex, offsetBy: (len - 1)/2)
    let toIdx = str.index(str.startIndex, offsetBy: len/2)
    return String(str[fromIdx...toIdx])
}
1 голос
/ 17 мая 2019

Вы можете использовать эту функцию:

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

    let count = str.count

    if count < 2 {
        return str
    }

    let start = str.index(str.startIndex, offsetBy: (count - 1)/2)
    let end = str.index(str.startIndex, offsetBy: (count + 2)/2)

    return String(str[start..<end])
}

Вот несколько вариантов использования:

middle("")          //""
middle("1")         //"1"
middle("12")        //"12"
middle("123")       //"2"
middle("1234")      //"23"
middle("12345")     //"3"
0 голосов
/ 17 мая 2019

вот еще один пример:

добавьте это расширение

extension StringProtocol {

    subscript(offset: Int) -> Element {
        return self[index(startIndex, offsetBy: offset)]
    }
    subscript(range: CountableClosedRange<Int>) -> SubSequence {
        return prefix(range.lowerBound + range.count)
            .suffix(range.count)
    }
}

используйте это как

let stringLength: Int = str.count
if stringLength % 2 == 0{
    //even
    print(str[((stringLength/2) - 1)...(stringLength/2)])
}else{
    //odd
    print(str[(stringLength/2) - 1])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...