数据结构与算法分析笔记与总结(java实现)--字符串7:句子的逆序练习题

题目:对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。给定一个原字符串A和他的长度,请返回逆序后的字符串。

测试样例:"dog loves pig",13返回:"pig loves dog"

思路:与String2左旋字符串近似。空格标点也算作字符,本题即要求对句子中的单词进行反转而单词内部的顺序不变。思路是进行两次反转,首先对每个单词进行反转得到 gip sevol god, 然后再对整个句子进行反转,得到dog loves pig,即主要是找到句子中的单词,再将每个单词进行反转,如何对单词进行反转?即以空格作为分割,使用两个指针beginIndex和endIndex遍历数组,beginIndex从第一个字符开始不动,endIndex注意遍历当遍历到空格时对当前beginIndex~endIndex之间的部分单词进行反转,然后endIndex++;beginIndex=endIndex;继续向下遍历,即对于空格不作处理,依然保持在原来的位置。对于空格不要进行反转直接跳过否则得到dog loves pigà” godsevolgip”à”pigloves dog “因为空格只是作为单词的分隔,不是单词的一部分,所以不要跟着单词进行反转;可以先将整个句子反转再对每个单词反转” dog loves pig”à”gipsevol god”à”dog loves pig” 也可以先对每个单词进行反转再对整个句子进行反转"dog loves pig"à”godsevol gip”à”pig loves dog”;这里使用先扫描单词对单词进行反转,再对整个句子进行反转。至于反转一个字符串很简单reverse(String str,int beginIndex,int endIndex)用于对字符串从beginIndex~endIndex范围的字符串进行反转,反转的策略是从头尾分别开始扫描,注意交换即可,直到p1>=p2;

注意细节:分割单词时怎样算是一个单词?当array[endIndex]==’ ’ 或者endIndex==length时endIndex之前的部分构成一个单词。即当endIndex遇到空格时说明前面是一个单词,还有当endIndex到达字符串的末尾,即使后面没有空格,也表示前面是一个单词。

importjava.util.*;

//对输入的句子中的单词进行反转,单词内部保持不变

publicclass Reverse {

    public String reverseSentence(String A, intn) {

       //特殊输入

        if(A==null||A.length()<0) returnnull;

       

       //将字符串A转换为字符数组便于进行处理

        char[] array=A.toCharArray();

       

       //定义两个指针beginIndex,endIndex用来截取每个被空格分隔的单词

        int beginIndex=0;

        int endIndex=0;

       

       //先扫描字符串,找到单词,对每个单词内部进行反转

        while(beginIndex<=array.length&&endIndex<=array.length){

//如果遇到空格表示前面是一个单词,如果p2就已经到达最后即endIndex=length那么也表示前面是一个单词

           if(endIndex==array.length||array[endIndex]==' '){

                //endIndex之前的字符串进行排序

               this.reverse(array,beginIndex,endIndex-1);

                endIndex++;

                beginIndex=endIndex;

            }else{

                endIndex++;

            }

        }

       

       //对整个句子进行反转

        this.reverse(array,0,array.length-1);

       

       //要求返回的是字符串,所以要将字符数组转变为字符串

        return String.valueOf(array);

    }

   

   //对字符串array[p1~p2]的范围内的字符串进行反转

    public void reverse(char[] array,int p1,intp2){

        while(p1<p2){

            char temp=array[p2];

            array[p2--]=array[p1];

            array[p1++]=temp;

        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值