本题解法有很多,这里介绍字符串切片、列表遍历拼接和字符串遍历拼接三种方法。后两种方法大同小异,下面我们来看下代码。
字符串切片
# Python3代码:
def reverseLeftWords1(s, n):
return s[n:] + s[:n]
s = "abcdefg"
n = 2
print(reverseLeftWords1(s, n))
# cdefgab
//Go代码:
func reverseLeftWords1(s string, n int) string {
return s[n:] + s[:n]
}
列表遍历拼接
# Python3代码:
def reverseLeftWords2(s, n):
res = []
for i in range(n, len(s)):
res.append(s[i])
for i in range(n):
res.append(s[i])
return "".join(res)
s = "90uisadjpa"
n = 2
print(reverseLeftWords2(s, n))
# uisadjpa90
字符串遍历拼接
# python3代码:
def reverseLeftWords3(s, n):
res = ""
for i in range(n, len(s)):
res += s[i]
for i in range(n):
res += s[i]
return res
# 遇到到尾端就要从头开始 的,基本都可以用取余的方法
def reverseLeftWords4(s, n):
res = ""
for i in range(n, n + len(s)):
res += s[i % len(s)] # 用取余来找下标
return res
s = "1111yiyi"
n = 4
print(reverseLeftWords3(s, n))
print(reverseLeftWords4(s, n))
# yiyi1111
//Go代码:
func reverseLeftWords2(s string, n int) string {
str1 := ""
str2 := ""
for i := 0; i < len(s); i++{
if i < n{
str1 += string(s[i])
}else {
str2 += string(s[i])
}
}
return str2 + str1
}
func main() {
s := "900abcdefg"
n := 3
//println(reverseLeftWords1(s, n))
println(reverseLeftWords2(s, n))
}
//abcdefg900
以上方法的运行耗时和内存消耗如下。不论语言,新建两切片字符串,并将两切片拼接为结果字符串,无冗余操作,效率最高;第二种方法,由于列表是可变对象,每轮遍历拼接字符时,只是向列表尾部添加一个新的字符元素。最终拼接转化为字符串时,系统仅申请一次内存 ;第三种方法,由于字符串是不可变对象,每轮遍历拼接字符时,都需要新建一个字符串;因此,系统需申请 N 次内存,数据量较大时效率低下。三种方法的时间和空间复杂度均为O(N)。