Java入門(String的3個演算法題)

大魚不做程式猿發表於2020-12-26

題目一

將一個字串進行反轉,將字串中指定部分進行反轉

方式一

轉換為char[]

public class HelloWorld {
    /*
    講一個字串進行反轉,將字串中指定部分進行反轉
    方式一:轉換為char[]
     */
    public static void main(String[] args) {
        HelloWorld temp = new HelloWorld();
        String str = "hello world!";
        String out = temp.reverse(str,2, 6);
        System.out.println(out);
        String s = temp.reverse(str);
        System.out.println(s);
    }

    public String reverse(String str, int startIndex,int endIndex){
        char[] arr = str.toCharArray();
        for(int x = startIndex,y = endIndex;x<y;x++,y--){
            char temp = arr[x];
            arr[x] = arr[y];
            arr[y] = temp;
        }
        return new String(arr);
    }
    public String reverse(String str){
        char[] arr = str.toCharArray();
        for(int x = 0,y = str.length()-1;x<y;x++,y--){
            char temp = arr[x];
            arr[x] = arr[y];
            arr[y] = temp;
        }

        return new String(arr);
    }

}

這裡提供兩個reverse()方法,兩個方法引數不同,屬於一個方法的過載。如果沒有指定startIndex和endIndex,那麼就把整體進行反轉;如果指定的話,就對指定的標號進行反轉。

當然也可以構造一個反轉的類,通過構造方法來進行不同引數的執行。

方式二
//方式二,使用string的拼接
public String reverse(String str, int startIndex,int endIndex){
       String reverseStr = str.substring(0,startIndex);
       for(int i = endIndex;i>= startIndex;i-- ){
           reverseStr +=str.charAt(i);
        }
       reverseStr += str.substring(endIndex + 1);
        return reverseStr;
    }

//這裡僅列出第二個方法部分的程式碼,如果需要使用參照方式一
//中的完整程式碼進行替換即可
方式三
//方式三,使用StringBuffer/StringBuilder替換String
public String reverse(String str, int startIndex,int endIndex){

        StringBuilder builder = new StringBuilder(str.length());
        builder.append(str.substring(0,startIndex));
        for(int i = endIndex;i>= startIndex;i--){
            builder.append(str.charAt(i));
        }
        builder.append(str.substring(endIndex + 1));

        return builder.toString();
    }

題目二

獲取一個字串在另一個字串中出現的次數。

public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld temp = new HelloWorld();
        String mainStr = "abdjkfabdfabdjkfba";
        String subStr = "ab";
        int count = temp.getCount(mainStr, subStr);
        System.out.println(count);

    }

    /**
     * 獲取subStr在mainStr中出現的次數
     * @param mainStr---目標字串
     * @param subStr---子字串
     * @return      次數
     */
    public int getCount(String mainStr,String subStr){
        int mainLength = mainStr.length();
        int subLength = subStr.length();
        int index;
        int count = 0;
        if(mainLength >= subLength){
            while((index = mainStr.indexOf(subStr))!= -1){
                count++;
                mainStr = mainStr.substring(index + subStr.length());
            }
            return count;
        }
        return 0;
    }
}

由於 mainStr= mainStr.substring(index + subStr.length());每次都要重新造一個,因此效率會降低。

因此提出一種改進的方法。

public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld temp = new HelloWorld();
        String mainStr = "abdjkfabdfabdjkfba";
        String subStr = "ab";
        int count = temp.getCount(mainStr, subStr);
        System.out.println(count);

    }

    /**
     * 獲取subStr在mainStr中出現的次數
     * @param mainStr---目標字串
     * @param subStr---子字串
     * @return      次數
     */
    public int getCount(String mainStr,String subStr){
        int mainLength = mainStr.length();
        int subLength = subStr.length();
        int index = 0;
        int count = 0;
        if(mainLength >= subLength){
            while((index = mainStr.indexOf(subStr,index))!= -1){
                count++;
                index += subLength;
            }
            return count;
        }
        return 0;
    }
}

題目三

獲取個字串中最大相同子串

//這裡假設只有一個最大相同字串(即str1中的子串在str2中僅有一種情況)

public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld temp = new HelloWorld();
        String str1 = "fjdkhellofjkd";
        String str2 = "hello";
        String str = temp.getMaxSameString(str1,str2);
        System.out.println(str);
    }
    public String getMaxSameString(String str1, String str2){
        String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
        String minStr = (str1.length() < str2.length()) ? str1 : str2;
        int length = minStr.length();
        for(int i = 0;i < length;i++){
            for(int x = 0,y = length-i;y <= length;x++,y++){
                String subStr = minStr.substring(x,y);
                if(maxStr.contains(subStr)){
                    return subStr;
                }
            }
        }
        return null;
    }
}

那麼如果是不止一個最大子串呢?在沒有學習集合之前,可以這樣處理。

import java.util.Arrays;
public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld temp = new HelloWorld();
        String str1 = "fjdkhellofjkdworld";
        String str2 = "helloworld";
        String[] out = temp.getMaxSameString(str1,str2);
        System.out.println(Arrays.toString(out));
    }
    public String[] getMaxSameString(String str1, String str2) {
        StringBuffer sBuffer = new StringBuffer();
        String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
        String minStr = (str1.length() < str2.length()) ? str1 : str2;

        int length = minStr.length();
        for (int i = 0; i < length; i++) {
            for (int x = 0, y = length - i; y <= length; x++, y++) {
                String subStr = minStr.substring(x, y);
                if (maxStr.contains(subStr)) {
                    sBuffer.append(subStr + ",");
                }
            }
            if (sBuffer.length() != 0) {
                break;
            }
        }
        String[] out = sBuffer.toString().replaceAll(",$", " ").split("\\,");
        return out;
    }
}

//	返回結果為:
//	[hello, world ]

相關文章