代码随想录算法训练营第八天|[344].反转字符串 、[541].反转字符串 II、 剑指Offer 05.替换空格、 [151].反转字符串中的单词 、剑指Offer58-II.左旋转字符串

[344].反转字符串

题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

思路 用不了库函数 go没 自己写,简单的反转 go中可以连续赋值 不用写函数很简单

func reverseString(s []byte)  {
	left,right:=0,len(s)-1
	for left < right {
		s[left],s[right] = s[right],s[left]
		left++
		right--
	}

}

[541].反转字符串 II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html

思路 反转字符串 这个判断的条件没有想清楚 i+=2*k 这需要自己模拟一下 其他的还算个基础题

func reverseStr(s string, k int) string {
	ss :=[]byte(s)
	for i := 0; i < len(ss); i+=2*k {
		if i+k < len(ss){
			reverseString(ss[i:i+k])
		}else{
			reverseString(ss[i:])
		}
	}
	return string(ss)
}

func reverseString(s []byte)  {
	left,right:=0,len(s)-1
	for left < right {
		s[left],s[right] = s[right],s[left]
		left++
		right--
	}

}

剑指Offer 05.替换空格

题目链接/文章讲解:https://programmercarl.com/%E5%89%91%E6%8C%87Offer05.%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.html

思路:切片添加遇到就加上%20

字符串连接, 字符串不可变但是可以连接,先创建一个空字符串然后把需要的接上 遇到空格+ %20就行

//切片添加

func replaceSpace(s string) string {
    ss:= []byte(s)
    result:= make([]byte,0)

    for i:=0;i<len(ss);i++{
        if ss[i]==' ' {
            result = append(result,[]byte("%20")...)
        }else{
            result = append(result,ss[i])
        }

    }
    return string(result)

}

//字符串连接

func replaceSpace(s string) string {
    str :=""
    for _,v := range s{
        if string(v)!=" "{
            str+=string(v)
        }else{
            str+="%20"
        }
    }
    return str

}

[151].反转字符串中的单词

题目链接/文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html

思路:反转好写 但是这个去除空格不好写,第一个if slow只是为了在第一个单词前不加空格,其他的是覆盖 ,一直覆盖到空格的位置,然后 if slow !=0 这里就会给后面加个空格 然后继续覆盖 本题自己写了一半 ,但是后来写完才知道难点是空格

func reverseWords(s string) string {
	ss:=[]byte(s)

	slow := 0 
	for i := 0; i < len(ss); i++ {
		if ss[i]!=' '{
			if slow != 0 {
				ss[slow]=' '
				slow++
			}
		
		for i<len(ss)&&ss[i]!=' ' {
			ss[slow] = ss[i]
			slow++
			i++
			
		}
	}
		
	}
	ss=ss[0:slow]


	j:=0
	reverseString(ss)
	for i := 0; i < len(ss); i++ {
		
		if ss[i]== ' '{
			reverseString(ss[j:i])
			j=i+1
		}else if i==len(ss)-1{
			reverseString(ss[j:i+1])
		}
	}
	return string(ss)



}
func reverseString(s []byte)  {
	left,right:=0,len(s)-1
	for left < right {
		s[left],s[right] = s[right],s[left]
		left++
		right--
	}

}

剑指Offer58-II.左旋转字符串

题目链接/文章讲解:https://programmercarl.com/%E5%89%91%E6%8C%87Offer58-II.%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

//这种方法简单但没含金量

func reverseLeftWords(s string, n int) string {
    return s[n:len(s)]+s[:n]
}

//反转三次 , 0-n n-end 0-end 就能有左旋字符串的效果


    //              123456
    //目标           345612
    //先反转前n个     213456
    //再反转n到end    216543
    //反转全部        345612
func reverseLeftWords(s string, n int) string {
        ss:=[]byte(s)

        reverseString(ss[0:n])
        reverseString(ss[n:len(ss)])
        reverseString(ss)
        return string(ss)
}

func reverseString(s []byte)  {
	left,right:=0,len(s)-1
	for left < right {
		s[left],s[right] = s[right],s[left]
		left++
		right--
	}
}

总结

今天的题不算难 但是字符串写法挺复杂的,这个感觉得多练练

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值