算法训练第7天|344.反转字符串|541. 反转字符串II|卡码网:54.替换数字

LeetCode 344.反转字符串

题目链接:344.反转字符串

题目讲解:代码随想录

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

func reverseString(s []byte)  {
    l := 0
    r := len(s) - 1

    for l < r{
        s[l], s[r] = s[r], s[l]
        l++
        r--
    }
}

LeetCode 541. 反转字符串II

题目链接:541. 反转字符串II

题目讲解:代码随想录

题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

遍历时,让i每次跳2*k个位置:

如果i + k <= length,说明剩余字符大于或等于 k 个,则反转前 k 个字符。

如果i + k > length,说明剩余字符少于 k 个,则将剩余字符全部反转。

func reverseStr(s string, k int) string {
    ss := []byte(s)
    length := len(s)
    for i := 0; i < length; i += 2*k{
         // 1. 每隔 2k 个字符的前 k 个字符进行反转
         // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
        if i + k <= length{
            reverse(ss[i: i+k])
        }else{
            reverse(ss[i:length])
        }
    }
    return string(ss)
}

func reverse(b []byte){
    l := 0
    r := len(b) - 1

    for l < r{
        b[l], b[r] = b[r], b[l]
        l++
        r--
    }
}

KamaCoder 54.替换数字

题目链接:54.替换数字

题目讲解:代码随想录

题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

如果想把这道题目做到极致,就不要只用额外的辅助空间了。使用双指针

具体思路为:

  1. 首先查看字符串中有多少个数字字符。
  2. 根据数字字符的个数,扩充原来的字符数组。
  3. 使用双指针,leftP指向原来字符串的最后端,rightP指向扩充后字符数组的最后端。
  4. 使用leftP遍历,如果遇到数字字符,则把"number"字符串从rigthP - len("number") + 1的位置往后依次填充。然后,更新rightP位置,向前移动len("number")个位置。leftP向前移动一位。
  5. 如果没有遇到数字字符,则把leftP指向的数组元素替换到rightP的位置上。rightP和leftP的位置都向前移动一位。
package main

import (
    "fmt"
    "os"
    "bufio"
)

func replaceNumber(strByte []byte) string {
    // 查看有多少字符
    numCount, oldSize := 0, len(strByte)
    for i := 0; i < len(strByte); i++{
        if (strByte[i] <= '9' && strByte[i] >= '0'){
            numCount++
        }
    }
    
    // 增加长度
    for i := 0; i < numCount; i++{
        strByte = append(strByte, []byte("     ")...)
    }
    
    tmpBytes := []byte("number")
    
    // 双指针从后遍历
    leftP, rightP := oldSize-1, len(strByte) - 1
    
    for leftP < rightP{
        
        rightShift := 1
        
        // 如果是数字则加入number
        if(strByte[leftP] <= '9'&& strByte[leftP] >= '0'){
            for i, tmpByte := range tmpBytes{
                strByte[rightP - len(tmpBytes) + i + 1] = tmpByte
            }
            rightShift = len(tmpBytes)
        }else{
            strByte[rightP] = strByte[leftP]
        }
        
        //更新指针
        rightP -= rightShift
        leftP -= 1
    }
    return string(strByte)
}

func main(){
    scanner := bufio.NewScanner(os.Stdin)
    
    scanner.Scan()
    input := scanner.Text()
    
    newString := replaceNumber([]byte(input))
    fmt.Println(newString)
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值