Строка сдвига по кругу влево и вправо быстро
На 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
}