JZ73 翻转字符串——翻转单词顺序

题目描述

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

最简单的方法:

public String ReverseSentence(String str) {
        String[] s = str.trim().split(" ");
        StringBuilder sb = new StringBuilder();
        int len = s.length - 1;
        for(int i = len;i >= 0;i--){
            sb.append(s[i] + " ");
        } 
        return sb.toString().trim();
        
    }

这道题很多次公司拿来作为面试题 ,可以通过两次翻转字符串来实现

思路:

第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但反转了句子中单词的顺序,连单词内的字符顺序也被反转了。

第二步再翻转每个单词中的字符的顺序,就得到了"student. a am I"。该步要注意翻转每个单词的时候,是通过空格来区分单词的,但是最后一个单词结束的位置(即字符串初始位置)没有空格因此需要我们提前先加一个空格,最后再去掉

代码实现如下:

public static String reverseSentence(String str) {
    String res = new String();
    if(str == null || sgr.length() <= 0){
        return res;
    }
    String str1 = " " + str;
    //先翻转整个字符串
    char[] s = str1.toCharArray();
    reverse(s, 0 , s.length-1);
    //再翻转每个单词,单词通过空格区分
    int begin = 0;
    for(int i = 0; i < s.length;i++){
        if(s[i] == " "){
            reverse(s, begin, i-1);
            begin = i + 1;
        }
    }
    //转化为字符串后,去掉最后一个空格
    String str2 = String.valueOf(s);
    return str2.substring(0,str2.length()-1);
    

}

public static void reverse(char[] s, int left, int right){
    while(left < right){
        char temp = s[right];
        s[right] = s[left];
        s[left] = temp;
        left++;
        right--;
    }
}

其他方法:

实现代码

public String ReverseSentence(String str){
    str = str.trim();
    int j = str.length() - 1,i = j;
    StringBuilder res = new StringBuilder();
    while(i >= 0){
        while(i >= 0 && str.charAt(i) != ' '){
            i--;
        }
        res.append(str.substring(i+1,j+1) + " ");
        while(i >= 0 && str.charAt(i) == ' ')
            i--;//跳过空格
        j = i;//指向下一个单词的末尾
    }
    return res.toString().trim();

}

题目二:左旋转字符串

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

思路分析:

以"abcdefg"为例,我们可以把它分为两部分。由于想把它前两个字符移到后面,我们就把前两个字符分到第一部分,后面的字符分到第二部分。我们先分别翻转这两部分,于是就得到"bagfedc",接下来翻转整个整个字符串,得到的"cdefgab"刚好就是把原始字符串左旋转两位的结果。

代码实现:

public static String leftRotateString(String str, int n) {
    if(str == null || n < 0)
        return "";

    char[] s = str.toCharArray();
    int left = 0;
    int mid = n;
    int right = str.length() - 1;
    //翻转第一部分
    reverse(s, left, mid);
    //翻转第二部分
    reverse(s, mid+1, right);
    //翻转整个字符串
    reverse(s, left, right);
    return String.valueOf(s);
}

public static void reverse(char[] s, int left, int right){
    while(left < right){
        char temp = s[right];
        s[right] = s[left];
        s[left] = temp;
        left++;
        right--;
    }
}

你可能感兴趣的:(算法,数据结构,java)