算法题
字符串(string)
替换数字

替换数字

题目

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3
样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000

思路

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

首先扩充数组到每个数字字符替换成 "number" 之后的大小。

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

  • 如果 s[j] 是数字字符,那么 s[i] = 'r', s[i-1] = 'e', s[i-2] = 'b', s[i-3] = 'm', s[i-4] = 'u', s[i-5] = 'n', s[i-6] = 'o', s[i-7] = 'n',然后 i = i - 8, j = j - 1。
  • 如果 s[j] 不是数字字符,那么 s[i] = s[j],然后 i = i - 1, j = j - 1。

解法

package main
 
import "fmt"
 
func main(){
    var strByte []byte
 
    fmt.Scanln(&strByte)
 
    for i := 0; i < len(strByte); i++{
        if strByte[i] <= '9' && strByte[i] >= '0' {
            inserElement := []byte{'n','u','m','b','e','r'}
            strByte = append(strByte[:i], append(inserElement, strByte[i+1:]...)...)
            i = i + len(inserElement) -1
        }
    }
 
    fmt.Printf(string(strByte))
}