0

在 Hackerrank 我遇到了这个问题。我有一个接受 3 个参数的函数。示例 -->

func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String

左移:字符串的单次循环旋转,其中第一个字符变为最后一个字符,所有其他字符向左移动一个索引。例如,abcde 左移一次后变为 bcdea,左移两次后变为 cdeab。

Right Shift 字符串的单次循环旋转,其中最后一个字符成为第一个字符,所有其他字符都向右移动。例如,abcde 在一次右移后变为 eabcd,在两次右移后变为 deabc。

我在 python 中做了同样的问题并通过了所有的测试用例

def getShiftedString(s, leftShifts, rightShifts):
i=(leftShifts-rightShifts)%len(s)
return s[i:]+s[:i]

现在我正试图迅速解决同样的问题。我在下面添加了我的解决方案

func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String {
// Write your code here
let len = s.count
var i=(leftShifts-rightShifts)%len

let c = s[..<i]
let b = s[i...]
let d = c + b 
return d }

我是快速编程的新手,我无法解决这个问题。谁能帮我快速解决这个问题?

提前致谢。

4

2 回答 2

0

一个非常基本的解决方案,有点冗长。

func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String {
    
    if s.isEmpty { return s }
    var effectiveLeftShift = leftShifts - rightShifts
    effectiveLeftShift = effectiveLeftShift % s.count // let's avoid multiple circulations
    if effectiveLeftShift == 0 { return s }

    var newS = s
    if effectiveLeftShift > 0 {
        for _ in 0..<effectiveLeftShift {
            let c = newS.first!
            newS = String(newS.dropFirst())
            newS.append((c))
        }
    } else {
        for _ in 0 ..< -effectiveLeftShift {
            let c = newS.last!
            newS = String(newS.dropLast())
            newS = String(c) + newS
        }
    }
    return newS
}

并且不那么冗长:

func getShiftedString2(_ s: String, leftShifts: Int, rightShifts: Int) -> String {
    
    if s.isEmpty { return s }
    var effectiveLeftShift = leftShifts - rightShifts
    effectiveLeftShift = effectiveLeftShift % s.count // let's avoid multiple circulations
    if effectiveLeftShift == 0 { return s }
    
    var newS = s
    if effectiveLeftShift > 0 {
        let c = String(s.prefix(effectiveLeftShift))
        newS = String(s.dropFirst(effectiveLeftShift))
        newS.append(c)
    } else {
       let effectiveRightShifts = -effectiveLeftShift
            let c = String(s.suffix(effectiveRightShifts))
            newS = String(s.dropLast(effectiveRightShifts))
            newS = c + newS
    }
    return newS
}
于 2021-08-04T10:33:45.850 回答
0

您可以从范围创建子字符串。

代码:

func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String {
    var diff = (leftShifts - rightShifts) % s.count
    while diff < 0 {
        diff += s.count
    }
    guard diff != 0 else { return s }

    let diffIndex = s.index(s.startIndex, offsetBy: diff)
    let first = s[diffIndex ..< s.endIndex]
    let last = s[s.startIndex ..< diffIndex]
    return String(first + last)
}
print(getShiftedString(s: "Hello world!", leftShifts: 4, rightShifts: 2))
// Prints: llo world!He

print(getShiftedString(s: "Hello world!", leftShifts: 2, rightShifts: 5))
// Prints: ld!Hello wor
于 2021-08-04T10:41:30.543 回答