题目:反转字符串
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
分析:只能使用O(1)的额外空间,在原数组进行修改,所以我想到的就是,二分法,交换元素
代码:
func reverseString(s []byte) {
n:=len(s)
j:=1
var b byte
for i:=0;i<n/2;i++{
if s[i]!=s[n-j]{
b=s[i]
s[i]=s[n-j]
s[n-j]=b
}
j++
}
}
题目:反转字符串(二)
题目描述:给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
分析:很明显这个涉及到字符串与数组的一个转化,然后在分步进行上述操作,我写的代码比较冗余,为了清楚理解,你可以合并一下
代码:
func reverseStr(s string, k int) string {
str:=[]byte(s)
n:=len(str)
x:=2*k
a:=n/x //a段正常操作
b:=n%x //留下b个数
flag:=0
var temp byte
if b>k{
flag=1 //是否剩余多余k个字符
}
for i:=0;i<a;i++{ //对前a段进行二分交换
y:=1
for j:=i*x;j<(2*i*x+k)/2;j++{
if str[j]!=str[i*x+k-y]{
temp=str[j]
str[j]=str[i*x+k-y]
str[i*x+k-y]=temp
}
y++
}
}
if flag==1{ //如果flag==1,就对前k个交换
y:=1
for j:=a*x;j<(2*a*x+k)/2;j++{
if str[j]!=str[a*x+k-y]{
temp=str[j]
str[j]=str[a*x+k-y]
str[a*x+k-y]=temp
}
y++
}
}else{ //交换剩下的所有
y:=1
for j:=a*x;j<(n+a*x)/2;j++{
if str[j]!=str[n-y]{
temp=str[j]
str[j]=str[n-y]
str[n-y]=temp
}
y++
}
}
return string(str)
}
题目:反转字符串(三)
题目描述:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
分析:很简单了,先分割,再反转,再合并
代码:
func reverseWords(s string) string {
str :=[]string{}
str=strings.Fields(s)
n:=len(str)
var temp byte
for i:=0;i<n;i++{
b:=[]byte(str[i])
l:=len(b)
a:=1
for j:=0;j<l/2;j++{
if b[j]!=b[l-a]{
temp=b[j]
b[j]=b[l-a]
b[l-a]=temp
}
a++
}
str[i]=string(b)
}
return strings.Join(str," ")
}
代码看着多,很容易理解。