剑指offer58题:翻转单词的顺序

题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

这里提供两种思路

方法一

先对原始字符串以空格进行分割,分割成不同的单词,以字符串数组形式存放,然后从后往前遍历数组,逐个加入到stringbuffer中,每次加入一个后再加入一个空格“ ”,当到数组第一个位置时,不添加空格。

完整代码如下:

public class Solution {
    public String ReverseSentence(String str) {
        if(str.trim().equals("")){
            return str;
        }
        String[] list = str.split(" ");
        StringBuffer sb = new StringBuffer();
        for(int i = list.length - 1; i >= 0; i --){
            if(i != 0){
                sb.append(list[i]);
                sb.append(" ");
            }else{
                sb.append(list[i]);
            }
            
        }
        return sb.toString();
    }
}

其中str.trim()是去掉字符串两端的空格,假如输入为" This is YiiBai ",则使用trim()后就变成了"This is YiiBai"
经过这样的操作后,就可以通过equals("")来判断输入是否非空了,如果这样进行非空判断str.equals(" "),则只能判断是不是一个空格,假如输入为两个空格、三个空格,则无法判断。

方法二

两次反转的思路,先把整个字符串整体反转,如“student. a am I”,反转后变成“I ma a .tneduts”,这时每个单词在句子中的顺序是对的,只是每个单词本身顺序颠倒了,然后再对每个单词进行反转,就得到了正确的序列“I am a student.”

完整代码如下:

public class Solution {
    public String ReverseSentence(String str) {
        char[] chars = str.toCharArray();
        reverse(chars,0,chars.length - 1);
        int blank = -1;
        for(int i = 0;i < chars.length;i++){
            if(chars[i] == ' '){ 
                int nextBlank = i;
                reverse(chars,blank + 1,nextBlank - 1);
                blank = nextBlank;
            }
        }
        reverse(chars,blank + 1,chars.length - 1);//最后一个单词单独进行反转
        return new String(chars);
         
    }
    public void reverse(char[] chars,int low,int high){
        while(low < high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
    }
}

其中reverse(char[] chars,int low,int high)是反转字符串函数,lowhigh是指定只对固定范围的字符串进行反转。最开始low0highlength-1,就完成了字符串整体的反转,然后再通过判断空格来分割单词,对每个单词进行反转。

 if(chars[i] == ' '){ 
    int nextBlank = i;
    reverse(chars,blank + 1,nextBlank - 1);
    blank = nextBlank;
 }

每次遇到空格,就把前一个空格位置加一和空格位置减一之间的字符串进行反转,因为最后一个单词后面没有空格,所以要单独反转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值