原题链接151.反转字符串中的单词
思路:
1.可以使用额外空间,先对字符串进行空格处理,去掉多余空字符、前导空字符、末尾空字符。使用双指针检测空格,然后将子字符串赋值进新空间内即可,但是这样用了多的额外空间
2.因为不确定相邻在子字符串之间有多少空格,以及字符串开头和结尾有多少空格,所以先对字符串进行去空格处理.去掉多余空字符、前导空字符、末尾空字符后,只需要将整个字符串反转,然后反转相应子字符串就可以,空间复杂度为O(1),代码如下
go
by_s :=[]byte(s)
fast :=0
//去空字符
//去掉前导空字符
for len(by_s) >0 && fast <len(by_s) &&by_s[fast]==' '{//by_s不为空且遍历没有到末尾且当前下标指向空字符
fast++//记录有多少个前导空字符
}
by_s = by_s[fast:len(by_s)]//把前导空字符给去掉
//去掉最后的空字符
fast = len(by_s) - 1
for len(by_s) > 0 && by_s[fast] ==' '{//因为要访问数组,所以是-1,到最后切片的时候再加上去就可以了
fast--
}
by_s = by_s[:fast+1]
//去掉中间空字符
fast = 0
slow := 0
for fast < len(by_s){//遍历整个字符串检测到前一个字符为空字符,则覆盖,最后一个字符必不为空字符
if by_s[fast] == ' ' && by_s[fast+1] ==' '{
fast++
}else{
by_s[slow] = by_s[fast]
slow++
fast++
}
}
by_s = by_s[:slow]
go
//2.1反转整个字符串
reverse(by_s)
//return string(by_s)
//2.2反转空格之间的子字符串
cns :=0
for j,i:=0,0;i<len(by_s);i++{
if by_s[i] == ' '{//如果是空字符,则子字符串输入反转
reverse(by_s[j:i])
j = i+1 //i此时是空格,i+1则代表空格后的字符,用于下一次反转,直接从j开始
cns = j//记录j,用于反转最后一个子字符串
}
}
reverse(by_s[cns:len(by_s)])//反转末尾的子字符串
return string(by_s)
}
--反转函数
go
func reverse(b []byte){
left :=0
right := len(b)-1
for left < right{
b[left],b[right] = b[right],b[left]
left++
right--
}
}