实现翻转字符串

I am a studnet转换成I ma a tneduts有什么效率好点的实现

阅读 2.4k
3 个回答

剑指offer第二版58题的简化版,基于此随便改一下就行
没写过java,有什么不合适的欢迎指出
github
leetcode
时间复杂度O(N)
空间复杂度O(N)

public class Solution1 {
    /**
     * 翻转单词顺序
     * @param str
     * @return
     */
    static public String reverseSentence(String str) {
        if (str == null || str.length() == 0) {
            return "";
        }
        char[] chars = str.toCharArray();
        //反转每个单词
        int i = 0, j = 0;
        while (j <= chars.length) {
            if (j == chars.length || chars[j] == ' ') {
                reverse(chars, i, j - 1);
                i = j + 1;
            }
            j++;
        }
        return new String(chars);
    }

    /**
     * 反转char数组
     * @param chars
     * @param start
     * @param end
     */
    static public void reverse(char[] chars, int start, int end) {
        while (start < end) {
            swap(chars, start, end);
            start++;
            end--;
        }
    }

    /**
     * 交换char数组两个位置的值
     * @param chars
     * @param i
     * @param j
     */
     public static void swap(char[] chars, int i, int j) {
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
    
    
     public static void main(String []args){
        System.out.println(reverseSentence("I am a studnet"));
     }
}

默认实现方式:起一个一样的数组,一边遍历一边反着插入,空间和时间都是O(n),也没啥优化空间吧
除非允许写一套特殊的字符串访问逻辑,从逻辑上实现字符串反转,这样就O(1)了

定义一个临时字符串,将原来的字符串从未到头的一个个的添加到临时字符串中,这样做法的复杂度是O(n),感觉没有什么可以优化的空间了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题