signed

QiShunwang

“诚信为本、客户至上”

Java入门(String的3个算法题)

2020/12/26 14:58:01   来源:

题目一

将一个字符串进行反转,将字符串中指定部分进行反转

方式一

转换为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 ]