代码随想录训练营day8


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)
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃瓜太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值