java以单词的维度反转字符串(中间的空格不确定,并不可以缺少)

面试题(测试工程师的面试题):

有一个类似:“this is a book !”的字符串,要求把字符串反转成“! book a is this”,反转单词倒是好说,但是要求两个单词中的空格数不一定,而且不能有缺失

思路:

先把字符串切割成一个字符串数组,按照“”进行切割。或者转成char[] 也是可以的
然后再去遍历这个数组
如果当前的字符串不是" “,就一直添加到一个StringBuffer中,如果遍历到了空格,就说明单词结束了,就将这个单的StringBuffer添加到一个List中,并且把这个StringBuffer置空
如果当前的字符串是” ",就一直添加另一个StringBuffer中,如果遍历到字母,就说明不定长的空格结束了,就将这个不定长的空格字符串继续加到List中,然后置空这个StringBuffer()这样list中的元素不是单词就是一个不定长的空格,但是要注意,因为每次的添加操作都是在下一次遍历时进行,所以最后一个单词或者空格要单独做处理,然后反转这个list即可
表达能力有限,描述的不明不白,直接上代码吧

代码:

//  反转字符串
//  "this is    a      book , is very      good    !" 反转成 "!    good      very is , book      a    is this"
//  坑:中间的空格不确定,但是反转后不能丢失空格,以单词维度进行反转
    public String reverse(String str){
        String [] strArray = str.split("");
//        装载每一个单词
        StringBuffer word = new StringBuffer();
//        装载每一个不定长的空格
        StringBuffer space = new StringBuffer();
//        最终的反转字符串
        StringBuffer reverseStr = new StringBuffer();
//        每一个单词或者空格,按照顺序添加到该list中
        List<String> finalStr = new ArrayList<>();
//        不用增强for,因为遍历到最后一次,要做单独处理,要通过索引判断最后一次的遍历
        for (int i = 0; i < strArray.length; i++) {
//            判断当前字符串是空格还是字母,都做累加,但是在各自的if分支中,如果遇到切换(字母到空格,空格到字母)的情况,证明单词拼接完成,或者不定长的空格结束了,就要将这个字符串添加到list中,并且当前的StringBuffer
            if (!strArray[i].equals(" ")){
                if (space.length() != 0){
                    finalStr.add(space.toString());
                    space.setLength(0);
                }
                word.append(strArray[i]);
            }else {
                if (word.length() != 0){
                    finalStr.add(word.toString());
                    word.setLength(0);
                }
                space.append(" ");
            }
//            对最后一次的数据进行处理,由于每次添加到list中都是在下一次判断中生效,所以在遍历最后一个字符串的时候,单独处理
            if (i == strArray.length-1){
                finalStr.add(word.length() == 0 ? space.toString() : word.toString());
            }
        }
//        倒序添加到StringBuffer
        for (int i = finalStr.size(); i > 0; i--) {
            reverseStr.append(finalStr.get(i-1));
        }
        return reverseStr.toString();
    }

调用

    @Test
    public void test999(){
        String s = "         this is    a      book , is very      good    !        ";
        System.out.println(reverse(s));
    }

结果:

运行结果

这个问题是半个月之前面试中遇到的问题,当时没有理解面试官的题面,把空格都给干掉了,今天趁着有空,重新写了一下,如果大家有更好的方案,可以在下方进行评论给予指导!!!谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值