面试题58:翻转字符串

2019-08-28  本文已影响0人  繁星追逐

/**

public static String ReverseSentence(String str) {
        if (str.isEmpty() || str.length() == 0) return str;
        StringBuilder sb = new StringBuilder();
        String[] strArray = str.split(" ");
        for (int i=strArray.length-1;i>=0;i--){
            sb.append(strArray[i]);
            if (i > 0) sb.append(" ");
        }
        return sb.toString();
    }

思路二:先依次翻转所有的字符,再把每个单词翻转为正常的顺序

/**
     * 分为两个步骤(递归)
     * 将字符中的所有单词翻转
     * 将每个单词再翻转回来正常的顺序
     * @param str
     * @return
     */
    public static String reverseWords(String str) {
       if (str == null || str.length() == 0){
           return "";
       }
       char[] c = str.toCharArray();
       int len = str.length();
       reverse(c, 0, len-1);
       int low = 0;
       int high = 0;
       while (low < len){
           //分为三种情况,如果低位为空,则将索引都移动
           //若高位为空或者到头,则将高位前一位之前的单词翻转
           //否则移动高位指针
           if (c[low] == ' '){
               low++;
               high++;
           }else if (high == len || c[high] == ' '){//数组调用和索引判断的顺序不能变
               reverse(c, low, --high);
               low = ++high;
           }else {
               high++;
           }
       }
       //转化为字符串输出
       return new String(c);


    }

    private static void reverse(char[] chars, int low, int high) {
        while (low < high){
            char c = chars[high];
            chars[high] = chars[low];
            chars[low] = c;
            low++;
            high--;
        }
    }

思路一:用java截取,先截取要改变的字符到整个字符末尾,再从不变字符的第一个开始截取到最后。

public String leftRotateString1(String str, int n) {
        if (str == null || n < 0 || n > str.length()) return null;
        StringBuilder sb = new StringBuilder(str);
        sb.append(str.substring(0,n));
        return sb.substring(n,sb.length()-1);

    }

思路二:先逆转要移动的字符,再逆转不要移动的字符,最后逆转所有字符。

public static String LeftRotateString(String str,int n) {
        if (str == null || n < 0 || n > str.length()) return "";
        char[] chars = str.toCharArray();
        //先把要后移的字符和不要移动的字符分别逆转,然后整体逆转便可
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length-1);
        reverse(chars, 0, chars.length-1);

        return new String(chars);

    }
上一篇 下一篇

猜你喜欢

热点阅读