Leetcode的AC指南 —— 字符串/卡码网:54. 替换数字
2024-01-01 16:29:07
摘要:
Leetcode的AC指南 —— 字符串/卡码网:54. 替换数字。题目介绍:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
一、题目
题目介绍:给定一个字符串 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<iostream>
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;
}
}
文章来源:https://blog.csdn.net/Huacyu/article/details/135324688
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!