(一)问题描述
54. 替换数字(第八期模拟笔试)https://kamacoder.com/problempage.php?pid=1064给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述:输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述:打印一个新的字符串,其中每个数字字符都被替换为了number
示例:
输入:a1b2c3输出:anumberbnumbercnumber
提示:
- 数据范围:1 <= s.length < 10000。
(二)解决思路
1. 数组+双指针
题目本意是解决数组填充类的问题。将原字符串转换为数组,数组的长度需要在原长度的基础上加上number的长度。扩充数组的长度后,再按照由后往前的顺序将number填充到合适的位置上。这里不采用从前往后的方法填充,而是采用从后往前的方法填充,这是因为对于数组这一连续的空间,从前往后填充时需要将填充部分之后的元素整体向后移动,这一操作会增加时间复杂度。
对于其他语言,这种方式可以不使用额外的空间,但是Java一定要使用额外的空间,因为Java的String是不可修改的。
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.next();int len = s.length();for (int i = 0; i < s.length(); i++) {if (s.charAt(i) >= 0 && s.charAt(i) <= '9') {len += 5;}}char[] ret = new char[len];for (int i = 0; i < s.length(); i++) {ret[i] = s.charAt(i);}for (int i = s.length() - 1, j = len - 1; i >= 0; i--) {if ('0' <= ret[i] && ret[i] <= '9') {ret[j--] = 'r';ret[j--] = 'e';ret[j--] = 'b';ret[j--] = 'm';ret[j--] = 'u';ret[j--] = 'n';} else {ret[j--] = ret[i];}}System.out.println(ret);}
}
2. StringBuffer
我是用Java的StringBuffer来做的这道题。我不知道这样的做法是不是合适,因为这道题的本意是想考察数组的填充问题。不过用StringBuffer来做确实简单得不是一星半点。
import java.util.Scanner;
public class Main{public static String changeNumber(String s){StringBuffer res=new StringBuffer();for(int i=0;i<s.length();i++){if(s.charAt(i)<97){res.append("number");}else{res.append(s.charAt(i));}}return res.toString();}public static void main(String args[]){Scanner scanner=new Scanner(System.in);if(scanner.hasNext()){String str=scanner.next();String result=changeNumber(str);System.out.println(result);}scanner.close();}
}
(三)易错点
这道题是采用ACM模式来做的。我是简单过了一遍Java基础,然后通过刷题来练习Java的使用,所以有些地方显得不是很熟练。
1. 我采用ASCII码的大小比较来判断小写字母和阿拉伯数字。小写字母的ASCII码范围在97-122,数字在48-57,大写字母在65-90.
2. Java可以使用Scanner来获取用户在控制台的输入,scanner对象使用完之后要记得scanner.close(),这里close是个方法,要记得加小括号
3.在当前类的main函数中调用成员方法,需要将该成员方法也设置为静态方法,即加上static
4.Java中单引号用于char类型,字符串类型要用双引号
5.对每次读取的str的操作要放在if(scanner.hasNext())判断内