在 swift 中左右移动字符串循环
Shift string Circular left and right in swift
在 Hackerrank 上我遇到了这个问题。我有一个接受 3 个参数的函数。示例 -->
func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String
左移:字符串的单次循环旋转,其中第一个字符成为最后一个字符,所有其他字符向左移动一个索引。例如abcde左移一位后变为bcdea,左移两次后变为cdeab。
右移字符串的单个循环旋转,其中最后一个字符成为第一个字符,所有其他字符都向右移动。例如abcde右移1次后变为eabcd,右移2次后变为deabc
我在python做过同样的题并且通过了所有的测试用例
def getShiftedString(s, leftShifts, rightShifts):
i=(leftShifts-rightShifts)%len(s)
return s[i:]+s[:i]
现在我正在尝试解决 swift 中的相同问题。我在下面添加了我的解决方案
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 }
我是 swift 编程的新手 我无法解决这个问题。 swift 谁能帮我解决这个问题?
提前致谢。
一个非常基本的解决方案,有点冗长。
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
}
您可以从范围创建子字符串。
代码:
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
在 Hackerrank 上我遇到了这个问题。我有一个接受 3 个参数的函数。示例 -->
func getShiftedString(s: String, leftShifts: Int, rightShifts: Int) -> String
左移:字符串的单次循环旋转,其中第一个字符成为最后一个字符,所有其他字符向左移动一个索引。例如abcde左移一位后变为bcdea,左移两次后变为cdeab。
右移字符串的单个循环旋转,其中最后一个字符成为第一个字符,所有其他字符都向右移动。例如abcde右移1次后变为eabcd,右移2次后变为deabc
我在python做过同样的题并且通过了所有的测试用例
def getShiftedString(s, leftShifts, rightShifts):
i=(leftShifts-rightShifts)%len(s)
return s[i:]+s[:i]
现在我正在尝试解决 swift 中的相同问题。我在下面添加了我的解决方案
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 }
我是 swift 编程的新手 我无法解决这个问题。 swift 谁能帮我解决这个问题?
提前致谢。
一个非常基本的解决方案,有点冗长。
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
}
您可以从范围创建子字符串。
代码:
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