刷题Day7|344.反转字符串、541.反转字符串2、剑指5.替换空格、151.翻转字符串里的单词、剑指58.左旋转字符串

文章介绍了在Go语言中如何实现字符串反转,包括整体反转、按指定长度反转以及反转字符串中的单词。同时,讨论了替换空格和左旋转字符串的问题,使用了数组操作和双指针技术来解决。

344.反转字符串

反转字符串

541.反转字符串2

反转字符串2
这道题本身没什么难度,只需要把上面的函数抽象成方法调用即可。需要注意的是如果是go语言, 因为string是只读,所以需要首先转换成数组才能进行操作。

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

func ReverseN(s []byte, n int, start int) {
    for i := 0; i < n / 2; i++{
        tmp := s[start + i]
        s[start + i] = s[start + n - 1 - i]
        s[start + n - 1 - i] = tmp
    }
}

剑指5.替换空格

替换空格
计算空格数量后,倒着往前利用双指针法进行操作

151.翻转字符串里的单词

翻转字符串里的单词
比较骚气的方法就是先整体翻转,然后再把单词额外翻转回来。但是还是要清楚点多余的空格。
里面的清楚空格的子模块比较方便,所以记录一下。比如清楚前面的空格和单词中间多余的空格时,两个相邻的比较,如果相同且均为空格就判定一下。

func reverseWords(s string) string {
    tmp := []byte(s)
    start := 0
    end := 0
    //去除前面的空格
    for   tmp[start] == ' ' && start < len(tmp){
        start++
    }
    //去除中间的空格
    for  ; start < len(tmp) ; start++{
        if start - 1 > 0 && tmp[start - 1] == tmp[start] && tmp[start] == ' '{
            continue 
        }
        tmp[end] = tmp[start]
        end++
    }
    //去除末尾的空格
    if end - 1 > 0 && tmp[end - 1] == ' '{
        tmp = tmp[:end - 1]
    }else{
        tmp = tmp[:end]
    }
    //翻转整个字符串
    ReverseN(tmp, 0, len(tmp) - 1)
    //将单词翻转回来
    i := 0
    for i < len(tmp){
        j := i
        for ; j < len(tmp) && tmp[j] != ' ';j++{
        }
        ReverseN(tmp, i, j-1)
        i = j
        i++
    }
    return string(tmp)
}

func ReverseN(b []byte, left, right int){
    len := right - left + 1 
    for i := 0; i < len / 2; i++ {
		tmp := b[left + i]
        b[left + i] = b[right - i]
        b[right - i] = tmp
	}
}

剑指58.左旋转字符串

左旋转字符串
这个题目代码随想录的解法是先整体翻转,然后前len-n翻转,后n翻转
个人感觉还可以用取余的方式用快慢指针来遍历

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值