中人物迅捷

时间:2019-05-17 12:09:35

标签: swift

我有一个要解决的问题

我正在尝试查找单词的中间字符。如果单词的长度是奇数,则返回中间字符。如果单词的长度是偶数,请返回中间的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 个答案:

答案 0 :(得分:4)

假设您的字符串是整个单词(否则,在使用此属性之前,您需要先通过word枚举字符串):

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 :(得分:1)

您可以使用此功能:

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"

答案 2 :(得分:1)

让我们尝试系统地解决这个问题。第一项任务是确定“中间部分”的第一个和最后一个字符的偏移量。如果我们用一些代表性案例制作一张桌子

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字符串中的索引和偏移量,这在A New Model for Collections and Indices中进行了解释。

这导致实施

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])
}

答案 3 :(得分:0)

这是另一个示例:

添加此扩展名

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])
}