Java关于String类的几道算法题
2022.02.07String算法题
1.模拟一个trim方法,去除字符串两端的空格。将一个字符串进行反转。
自己写的:
publicString trimx(String s) { int len = s.length(); String st = s; for (int i = 0; i < len; i++) { if (s.charAt(i) != ' ') { st = s.substring(i); break; } } int lens = st.length(); for (; ; lens--) { if (st.charAt(lens - 1) != ' ') { st = st.substring(0, lens); break; } } return st; }
String类中的trim( )方法:
public String trim() { int len = value.length; int st = 0; char[] val = value; /* avoid getfield opcode */ while ((st < len) && (val[st] <= ' ')) { st++; } while ((st < len) && (val[len - 1] <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? substring(st, len) : this; }
另一种更好的解法:
public String myTrim(String str) { if (str != null) { int start = 0;// 用于记录从前往后首次索引位置不是空格的位置的索引 int end = str.length() - 1;// 用于记录从后往前首次索引位置不是空格的位置的索引 while (start < end && str.charAt(start) == ' ') { start++; } while (start < end && str.charAt(end) == ' ') { end--; } if (str.charAt(start) == ' ') { return ""; } return str.substring(start, end + 1); } return null; }
2.将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
自己写的:
public static String reversal(String s, int start, int end) { String st = s.substring(start, end); char[] c = new char[st.length()]; for (int i = 0; i < st.length(); i++) { c[i] = st.charAt(st.length() - 1 - i); } String sts = new String(c); String left = s.substring(0, start); String right = s.substring(end); return left + sts + right; }
答案:
// 第2题 // 方式一: public String reverse1(String str, int start, int end) {// start:2,end:5 if (str != null) { // 1. char[] charArray = str.toCharArray(); // 2. for (int i = start, j = end; i < j; i++, j--) { char temp = charArray[i]; charArray[i] = charArray[j]; charArray[j] = temp; } // 3. return new String(charArray); } return null; } // 方式二: public String reverse2(String str, int start, int end) { // 1. String newStr = str.substring(0, start);// ab // 2. for (int i = end; i >= start; i--) { newStr += str.charAt(i); } // abfedc // 3. newStr += str.substring(end + 1); return newStr; } // 方式三:推荐 (相较于方式二做的改进) public String reverse3(String str, int start, int end) {// ArrayList list = new ArrayList(80); // 1. StringBuffer s = new StringBuffer(str.length()); // 2. s.append(str.substring(0, start));// ab // 3. for (int i = end; i >= start; i--) { s.append(str.charAt(i)); } // 4. s.append(str.substring(end + 1)); // 5. return s.toString(); }
自己练习才能发现问题:
①思路不够严谨,没有加上null或者" "的判断;
②没有考虑到效率问题,字符串拼接效率较低,不是最优解
3.获取一个字符串在另一个字符串中出现的次数。比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
自己写的:
public static int repeatNumber(String str, String s) { int number = 0; if (str.contains(s)) { for (int i = 1; i < str.length() - s.length() + 1; i++) { if (i == str.length() - s.length()) { if (str.substring(str.length() - s.length()).toString().equalsIgnoreCase(s.toString())) { number++; } } if (str.substring(i, i + s.length()).toString().equalsIgnoreCase(s.toString())) { number++; } } } return number; }
答案:
public int getCount(String mainStr, String subStr) { if (mainStr.length() >= subStr.length()) { int count = 0; int index = 0; // while((index = mainStr.indexOf(subStr)) != -1){ // count++; // mainStr = mainStr.substring(index + subStr.length()); // } // 改进: while ((index = mainStr.indexOf(subStr, index)) != -1) { index += subStr.length(); count++; } return count; } else { return 0; } }