字符串按单词逆序算法的实现

(from 牛客)
给定字符串,在单词间进行逆序
如“hello world!”逆序后为“world! hello”;
如“I love you.”逆序后为“you. love I”;
以下办法均用Java实现,思想最重要
1.直接使用String的split方法

    public String reverseWords(String str) {
// 使用split(" ")会删除最后的空字符串,但不会删除最前面的
// 如果添加一个limit参数-1,则会显示所有的空字符串
        String[] words = str.split(" ",-1);
        StringBuilder sb = new StringBuilder("");
        for(int i = words.length-1;i>=0;i--) {
            if(i==0)
                sb.append(words[i]);
            else
                sb.append(words[i]+" ");
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = " i love dog. ";
        ReverseWords reversWords = new ReverseWords();
        System.out.println(reversWords.reverseWords(str));
    }

输出结果“ dog. love i ”。(语句前后的空格全部显示出来了的。)
2.不用split函数切割,直接用代码实现反转。当反转每个单词时,需要设置两个变量start和end用来指向单词的第一个位置和单词的下一个位置,end值每次加1,当end指向的值不为空格,则end继续递增;当end值为空格,需要判断end和start的位置。如果start小于end,则说明start和end之间为一个单词,此时可以进行反转,反转后,end加一,并赋值给start;如果start等于end,则说明当前指向的为空格,将空格添加进字符串中,end加1,并复制给start。
step1:构造reverse函数用来反转整个字符串的顺序
step2:再调用reverse反转每个单词的顺序
(step1和step2顺序可以对调)

public String reverse(String str) {
        int start = 0;
        int end = str.length()-1;
        //只有StringBuilder才有setCharAt方法,因此不能用String
        StringBuilder sb = new StringBuilder(str);
        while(start<end){ char ch = sb.charAt(start);
        sb.setCharAt(start++,sb.charAt(end));
        sb.setCharAt(end--,ch);
        }
        return sb.toString();
    }
    public String reverseWords(String str){
        String rvsStr = reverse(str);
        int start = 0;
        int end = 0;
        StringBuilder sb = new StringBuilder("");
        while(end<rvsStr.length()){ if(rvsStr.charAt(end)!=' ') end++;
            else if(end>start){ String subStr = reverse(rvsStr.substring(start,end));
            sb.append(subStr+" ");
            end++;
            start = end;
            }
            else{
            sb.append(" ");
            end++;
            start = end;
            }
        }
        //如果结尾为单词,则还需要执行下面的反转步骤
        if(end>start){ String subStr = reverse(rvsStr.substring(start,end));
        sb.append(subStr);
        }
        return sb.toString();
    } 

    public static void main(String[] args) {
        String str = " i love   dog.   ";
        ReverseWords reversWords = new ReverseWords();
        System.out.println(reversWords.reverseWords(str));
    }

输出结果“ dog. love i ”。

    原文作者:whafal
    原文地址: https://blog.csdn.net/l31299/article/details/79566002
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞