第一次在面试中手写算法,果然异常紧张,当时表现应该很不好吧,按照第一反应飞快写出来了一个有错误的版本。。。晚上在实验室仔细琢磨了一下这道题,发现早上自己写的简直。。。啊,我要尴尬死了!
题目描述:
写一个方法,实现将一个字符串中指定子串,全部替换为我们指定的目标串,如输入”abcdabc“,将其中"ab"全部替换为”ccc“。
输入
3个字符串
输出
void
思路:
从左向右扫描,如果可以切下ta长度的子串的话,就切下,与ta比较是否equals,如果equals,sb中加入th,如果不equals,sb加入切下子串temp的第一个字符,然后指针后移一位。如果文本串不足以切下ta长度,逐个加入文本串中指针i所在位置的字符,然后i后移一个位置。
反思:
当时写的程序没有考虑到,替换之后文本串的长度改变问题,以至于面试官问如果把c替换为ccb会不会出现无限循环的问题?按照下面的程序,当然不会出现这种情况,因为i作为指针,它之前的部分都是处理好的,它的移动也是根据不同情况变步长的。
当然这个问题坑很深,对java中字符串常用的方法得很熟才行,如subString带两个参数时第二个参数是可以等于文本串的长度的,这时不会越界,并且第一个if处,也应该加=。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class Main{
public static void change(String ori,String ta,String th){
StringBuilder sb = new StringBuilder();
for(int i=0;i<ori.length();){
String temp = "";
if(i+ta.length()<=ori.length()){
temp = ori.substring(i, i+ta.length());
}else{
sb.append(ori.charAt(i));
i++;
continue;
}
if(temp.equals(ta)){
sb.append(th);
i = i+ta.length();
}else{
sb.append(temp.charAt(0));
i++;
}
}
System.out.println(sb.toString());
}
public static void main(String args[]){
String ori = "aaaaaa";
String ta = "aaaa";
String th = "bx";
change(ori,ta,th);
}
}