大厂面试题:String相关二内容替换

面试题目 - String 的内容替换

题目来源

大厂面试题:String相关二内容替换_第1张图片

方法一 :递归实现

package best;

public class TestStringReplaceOne {
     
	static int count = 0;
	public static void main(String[] args) {
     
//		String s1 = "aabbcdabbajklkabb";
//		String s2 = "ab";
//		String s3 = "bab";
		long start = System.currentTimeMillis();
		 String s1 = "ababbabajababababababajabababajababababababajbbabajbabajababababababajabababbabajababababababajabababajbabajababababababajbabajababababbabajababababababajajabababbabajababababababajabababajbabababajababababababajababababababajababababababajababababababajababababababajababababababajababababababaj";
		 String s2 = "ab";
		 String s3 = "bba";	
		 String finalString = recursionReplace(s1, s2, s3);
		long end = System.currentTimeMillis();
		System.out.println(finalString);
		System.out.println("字符串长度:" + finalString.length());
		System.out.println("equals方法调用次数为:"+count);
		System.out.println("程序运行时间为:" + (end - start));
	}
    
	public static String recursionReplace(String s1, String s2, String s3) {
     
//		String returnString = s1.replace(s2, s3) ;   //系统
		String returnString = myReplace(s1, s2, s3) ;  //自定义
		// 如果替换后的值 不等于 传入的源字符串,则仍然存在匹配字面值目标序列的子字符串
		if (!myEquals(returnString, s1)) {
         //自定义
//		if (!returnString.equals(s1)) {       //系统
			//替换此字符串所有匹配字面值目标序列的子字符串   
			//替换至 不存在匹配字面值目标序列的子字符串为止  
			return recursionReplace(returnString, s2, s3);
		}
		//返回替换成功的字符串
		return returnString;
	}

	// 找到第一个子字符串的下标
	public static int myIndexOf(String s1, String s2) {
     
		int index = -1;
		for (int i = 0; i <= s1.length() - s2.length(); i++) {
     
			// 截取 对应的 匹配字面值目标序列长度的子字符串
			String targer = s1.substring(i, i + s2.length());
			// 通过自定义方法myEquals()来判断截取的子字符串 是否 匹配目标序列字符串
			if (myEquals(targer, s2)) {
     
				index = i;
				break;
			}
		}
		return index;
	}

	// 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
	public static String myReplace(String source, String oldStr, String newStr) {
     
		// 声明下标
		int index;
		String replaceAfter = "";
		// 定义未被替换的字符串 (字符串的后一半)
		String endString = source;
		// 定义 替换过后的字符串 (字符串的前一半)
		String startString;
		// 找到 匹配字面值目标序列的子字符串的下标 如果成功找到(下标不等于默认值 -1)
		while ((index = myIndexOf(endString, oldStr)) != -1) {
     
			// 则 截取 此下标的前一部分
			startString = endString.substring(0, index);
			// 再 截取 要替换子字符串 的后一部分,
			// 把这后半部分的字符串当作下一次要替换子字符串的 源字符串
			endString = endString.substring(index + oldStr.length());
			// 前半部分字符串+要替换的字串 拼接到给 替换后的要返回的最终字符串 上
			replaceAfter += startString + newStr;
		}
		// 替换后的要返回的最终字符串 + 后半部分字符串(剩下的,不存在要替换的子字符串)
		replaceAfter += endString;
		// 此字符串中,再无匹配字面值目标序列的子字符串,replace()成功,可以将其返回
		return replaceAfter;
	}

	// 判断两个字符串是否相等
	public static boolean myEquals(String sourceString, String newString) {
     
		count++;
		// 地址
		if (sourceString == newString) {
     
			return true;
		}
		// 是否为空
		if (newString == null) {
     
			return false;
		}
		// 长度是否相等
		if (sourceString.length() != newString.length()) {
     
			return false;
		}
		// 最后再判断具体内容是否一致
		for (int i = 0; i < sourceString.length(); i++) {
     
			if (sourceString.charAt(i) != newString.charAt(i)) {
     
				return false;
			}
		}
		return true;
	}

}

方法二 :循环替换实现

package best;

public class TestStringReplaceTwo {
     
	static int count = 0;

	public static void main(String[] args) {
     
//		String s1 = "aabbcdabbajklkabb";
//		String s2 = "ab";
//		String s3 = "bab";

		long start = System.currentTimeMillis();
		 String s1 = "ababbabajababababababajabababajababababababajbbabajbabajababababababajabababbabajababababababajabababajbabajababababababajbabajababababbabajababababababajajabababbabajababababababajabababajbabababajababababababajababababababajababababababajababababababajababababababajababababababajababababababaj";
		 String s2 = "ab";
		 String s3 = "bba";
		String finalString = myReplace(s1, s2, s3);
		long end = System.currentTimeMillis();
		System.out.println(finalString);
		System.out.println("字符串长度:"+finalString.length());
		System.out.println("equals方法调用次数为:"+count);
		System.out.println("程序运行时间为:" + (end - start));

	}

	public static int myIndexOf(String s1, String s2) {
     
		int index = -1;
		for (int i = 0; i <= s1.length() - s2.length(); i++) {
     
			// 截取 对应的 替换字符串长度 的 子字符串
			String targer = s1.substring(i, i + s2.length());
			// 通过自定义方法myEquals()来判断截取的子字符串 是否与 目标序列的字符串 相等
			if (myEquals(targer, s2)) {
     
				index = i;
				break;
			}
		}
		return index;
	}

	// 替换旧的子字符串 (一次一次地取出此字符串    并替换有匹配字面值目标序列的子字符串,直到所有匹配字面值目标序列的子字符串替换完成)
	public static String myReplace(String source, String oldChar, String newChar) {
     
		int index;
		String replaceAfter = source;
		// 找到 目标序列的字符串的下标    成功找到(下标不等于 默认值 -1)后:
		while ((index = myIndexOf(replaceAfter, oldChar)) != -1) {
     
			//从前往后一次次地   替换此字符串中匹配字面值目标序列的子字符串  直到此字符串中,再无要替换的目标序列字符串
			replaceAfter = replaceAfter.substring(0, index) + newChar
					+ replaceAfter.substring(index + oldChar.length());
		}
		//replace()成功,可以将其返回
		return replaceAfter;
	}
	// 判断两个字符串是否相等
	public static boolean myEquals(String sourceString, String newString) {
     
		count++;
		// 地址
		if (sourceString == newString) {
     
			return true;
		}
		// 是否为空
		if (newString == null) {
     
			return false;
		}
		// 长度是否相等
		if (sourceString.length() != newString.length()) {
     
			return false;
		}
		// 最后再判断具体内容是否一致
		for (int i = 0; i < sourceString.length(); i++) {
     
			if (sourceString.charAt(i) != newString.charAt(i)) {
     
				return false;
			}
		}
		return true;
	}

}

注意:

问题一

如果C字符串的子字符串中拥有B字符串,那么此程序将进入一个死循环

问题二

方法一使用的是递归,他的死循环直到垃圾回收器被频繁操作,出现错误时,程序终止

大厂面试题:String相关二内容替换_第2张图片

你可能感兴趣的:(java,java,字符串)