考研机试 46.单词替换
时间:2021/03/08
一.题目描述
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入描述
每组数据输入包括3行,第1行是包含多个单词的字符串s,第2行是待替换的单词a(长度<=100),
第3行是a将被替换的单词b(长度<=100)。
s, a, b 最前面和最后面都没有空格。
输出描述
每个测试数据输出只有 1 行, 将s中所有单词a替换成b之后的字符串。
题目链接
二.算法
题解
开始时我想使用String类的replaceAll方法进行替换,要注意该题替换的是单词,所以我先在被替换的单词前面前后分别加上空格来确保被替换的对象是单词,然后再判断第一个和最后一个单词是否是被替换对象,但是这种方法存在问题,即replaceAll方法并不能替换已经替换过的,即它在替换时存在一个类似于指针的东西,不会回头看,我们的解决方法是循环判断句子中是否存在被替换单词,若有则一直使用replaceAll方法进行替换。上面的方法还存在第二个问题,即字符串的比较问题,对于字符串的比较,我们不能使用运算符==,因为它实际上比较的是两个字符串的地址,必须要使用equals方法进行比较。不过之后又想出了更好的方法,我们既然已经将句子转化为了单词数组,那我们可以循环遍历整个数组,使用equals方法判断当前单词与被替换单词是否相同,相同则进行替换。
重点
1.replaceAll方法使用时存在问题,即不能替换已经被替换的字符串。
2.比较字符串是否相等要使用equals方法,不能使用运算符==。
代码
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); //读取输入 String str = in.nextLine(); String a = in.next(); String b = in.next(); //进行替换并输出 // while(str.contains(" " + a + " ")){ // str = str.replaceAll(" " + a + " ", " " + b + " "); // } // String[] s = str.split(" "); // if(s[0].equals(a)){ // s[0] = b; // } // if(s[s.length - 1].equals(a)){ // s[s.length - 1] = b; // } // int index = 0; // for(int i = 0; i < s.length; i++){ // index++; // if(index != s.length){ // System.out.print(s[i] + " "); // } // else{ // System.out.print(s[i]); // } // } // System.out.println(); String[] s = str.split(" "); for(int i = 0; i < s.length; i++){ if(s[i].equals(a)){ s[i] = b; } } for(String c : s){ System.out.print(c + " "); } } }
努力,向上,自律