Строка сдвига по кругу влево и вправо быстро

На Hackerrank я столкнулся с этой проблемой. У меня есть функция, которая принимает 3 аргумента. Пример ->

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

Сдвиг влево: один круговой поворот строки, в котором первый символ становится последним, а все остальные символы сдвигаются на один индекс влево. Например, abcde становится bcdea после одного сдвига влево и cdeab после двух сдвигов влево.

Сдвиг вправо Один круговой поворот строки, в котором последний символ становится первым символом, а все остальные символы смещаются вправо. Например, 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 }

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

Заранее спасибо.

2 ответа

Вы можете создавать подстроки из диапазонов.

Код:

      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

Очень простое решение, немного подробное.

      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
}
Другие вопросы по тегам