美文网首页剑指 Offer Java版
剑指Offer Java版 面试题58:翻转字符串

剑指Offer Java版 面试题58:翻转字符串

作者: 孙强Jimmy | 来源:发表于2019-08-07 19:12 被阅读0次

    题目一:翻转单词顺序。

    输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。

    练习地址

    https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3

    参考答案

    public class Solution {
        public String ReverseSentence(String str) {
            if (str == null || str.length() == 0) {
                return str;
            }
            char[] data = str.toCharArray();
            // 翻转整个句子
            reverse(data, 0, data.length - 1);
            // 翻转句子中的每个单词
            int start = 0, end = 0;
            while (start < data.length) {
                if (data[start] == ' ') {
                    start++;
                    end++;
                } else if (end == data.length || data[end] == ' ') {
                    reverse(data, start, end - 1);
                    start = ++end;
                } else {
                    end++;
                }
            }
            return new String(data);
        }
        
        private void reverse(char[] data, int start, int end) {
            while (start < end) {
                char temp = data[start];
                data[start] = data[end];
                data[end] = temp;
                start++;
                end--;
            }
        }
    }
    

    复杂度分析

    • 时间复杂度:O(mn)。
    • 空间复杂度:O(1)。

    题目二:左旋转字符串

    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

    练习地址

    https://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec

    参考答案

    public class Solution {
        public String LeftRotateString(String str, int n) {
            if (str == null || str.length() == 0 || n < 1 || n >= str.length()) {
                return str;
            }
            char[] data = str.toCharArray();
            // 翻转字符串的前面n个字符
            reverse(data, 0, n - 1);
            // 翻转字符串的后面部分
            reverse(data, n, data.length - 1);
            // 翻转整个字符串
            reverse(data, 0, data.length - 1);
            return new String(data);
        }
        
        private void reverse(char[] data, int start, int end) {
            while (start < end) {
                char temp = data[start];
                data[start] = data[end];
                data[end] = temp;
                start++;
                end--;
            }
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n)。
    • 空间复杂度:O(1)。

    👉剑指Offer Java版目录
    👉剑指Offer Java版专题

    相关文章

      网友评论

        本文标题:剑指Offer Java版 面试题58:翻转字符串

        本文链接:https://www.haomeiwen.com/subject/cmbadctx.html