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;
        }

    }

 

posted @ 2022-02-07 23:14  Fancy[love]  阅读(83)  评论(0编辑  收藏  举报