541. 反转字符串 II给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
思路:这个题很有意思,主要在k的选择上每次跳动2k大小的区间,前k进行反转即可,如果不满足i+k的限制,就就直接反转
func reverseStr(s string, k int) string {
n := len(s)
str:=[]byte(s)
for i:=0; i< n; i+=(k*2){
if i + k <= n{
reverse(str, i, i + k-1);
}else{
reverse(str, i, n-1);
}
}
return string(str);
}
func reverse(arr []byte,lf,ri int){
for lf<ri{
arr[lf],arr[ri]= arr[ri],arr[lf]
lf++
ri--
}
}
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."思路1:辅助数组,遇到' '添加'%20' ,否则就添加字符
思路2:扫描数组,查询空格个数,扩大到对应空间大小,lf ri指针进行补正
/*
func replaceSpace(s string) string {
res:=make([]byte,0)
str:= []byte(s)
for _,v:=range str{
if v == ' '{
res=append(res,[]byte("%20")...)
}else{
res = append(res,v)
}
}
return string(res)
}
*/
func replaceSpace(s string) string{
count:=0
for _,v:= range s{
if v == ' '{
count++
}
}
str:= []byte(s)
lf := len(s)-1
tmp:=make([]byte,count*2)
str= append(str,tmp...)
ri := len(str)-1
for lf >=0{
if str[lf]==' '{
str[ri] = '0'
str[ri-1] = '2'
str[ri-2] ='%'
ri =ri-2
}else{
str[ri] = str[lf]
}
lf --
ri--
}
return string(str)
}
151. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。思路:先去除首尾空格 加中间多余空格,反转字符串,反转单词
func reverseWords(s string) string {
b := []byte(s)
slow := 0
for i := 0; i < len(b); i++ {
if b[i] != ' ' {
if slow != 0 {
b[slow] = ' '
slow++
}
for i < len(b) && b[i] != ' ' { // 复制逻辑
b[slow] = b[i]
slow++
i++
}
}
}
b = b[0:slow]
reverse(b)
last := 0
for i := 0; i <= len(b); i++ {
if i == len(b) || b[i] == ' ' {
reverse(b[last:i])
last = i + 1
}
}
return string(b)
}
func reverse(b []byte) {
left := 0
right := len(b) - 1
for left < right {
b[left], b[right] = b[right], b[left]
left++
right--
}
}
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"思路1:反转三次
思路2:辅助数组,获取前n,然后提取后n,在拼接
func reverseLeftWords(s string, n int) string {
if len(s) ==0{return s}
str :=[]byte(s)
var tmp =make([]byte,n)
tmp = str[0:n]
length :=len(str)
str = str[n:length]
str = append(str,tmp...)
return string(str)
}