Leetcode的AC指南 —— 字符串/卡码网:54. 替换数字

摘要:
Leetcode的AC指南 —— 字符串/卡码网:54. 替换数字。题目介绍:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。

文章目录

  • 一、题目
  • 二、解析
    • 1、可以扩展为双指针的AC方法
    • 2、有潜在数组越界风险的AC方法,
  • 其他语言版本
    • Java
    • C++

一、题目


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

卡码网题目链接

  • 输入描述
    • 输入一个字符串 s,s 仅包含小写字母和数字字符。
  • 输出描述
    • 打印一个新的字符串,其中每个数字字符都被替换为了number
  • 输入示例
    • a1b2c3
  • 输出示例
    • anumberbnumbercnumber

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

二、解析


1、可以扩展为双指针的AC方法

go:

package main

import (
	"fmt"
)

func main() {
	for {
		var input1 string
		fmt.Println("请输入:")
		fmt.Scanln(&input1)
		fmt.Println(replaceNumber(input1))
	}

}

func replaceNumber(str string) string {
	runes := []byte(str)
	inserElement := []byte{'n', 'u', 'm', 'b', 'e', 'r'}
	for i := 0; i < len(runes); i++ {
		if runes[i] <= '9' && runes[i] >= '0' {
			runes = append(runes[:i], append(inserElement, runes[i+1:]...)...)
			// 关于append的语法
			// ”...“ 的作用是将切片runes[i + 1 : ]打散为一个个的元素,然后逐一添加到inserElement中,
			// 而不是将runes[i+1 : ] 作为一整个切片进行添加
			i = i + len(inserElement) - 1 // 更新i的坐标
		}
	}
	return string(runes)
}

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

2、有潜在数组越界风险的AC方法,

能够正常运行,但是存在一个潜在的数组越界的风险。这主要是因为你在循环中多次创建了 runes 切片,而在切片越界的情况下,程序会产生运行时错误。

具体来说,在循环内的每次迭代中,你都重新创建了 runes 切片,但是 i 的范围没有受到控制。因此,如果在循环的某一次迭代中 i 达到了字符串的长度,那么 runes[i] 就会越界,导致运行时错误。

package main

import (
	"fmt"
)

func main() {
	for {
		var input1 string
		fmt.Println("请输入:")
		fmt.Scanln(&input1)
		fmt.Println(replaceNumber(input1))

	}

}

func replaceNumber(str string) string {

	for i := len(str) - 1; i >= 0; i-- {
		runes := []rune(str)
		if runes[i] < 'a' || runes[i] > 'z' {
			temp1 := string(runes[0:i]) // runes[i : j] 左闭右开[i,j)
			if i+1 == len(str) {
				str = temp1 + "number"
			} else {
				temp2 := string(runes[i+1 : len(str)])
				str = temp1 + "number" + temp2
			}

		}
	}
	return str
}

其他语言版本


Java

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                sb.append("number");
            }else sb.append(s.charAt(i));
        }
        System.out.println(sb);
    }
}

C++

#include
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int count = 0; // 统计数字的个数
        int sOldSize = s.size();
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewSize = s.size();
        // 从后先前将空格替换为"number"
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
            if (s[j] > '9' || s[j] < '0') {
                s[i] = s[j];
            } else {
                s[i] = 'r';
                s[i - 1] = 'e';
                s[i - 2] = 'b';
                s[i - 3] = 'm';
                s[i - 4] = 'u';
                s[i - 5] = 'n';
                i -= 5;
            }
        }
        cout << s << endl;
    }
}


你可能感兴趣的:(leetcode的AC指南,leetcode,算法)