题解 | #句子逆序#

句子逆序

http://www.nowcoder.com/practice/48b3cb4e3c694d9da5526e6255bb73c3

库函数

思路

  1. 使用 split() 方法按照空格分割,得数组 arr
  2. 逆序遍历 arr,并添加到 res
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] arr = in.nextLine().split(" ");
        StringBuilder res = new StringBuilder();
        for (int i = arr.length - 1; i >= 0; i--) {
            res.append(arr[i]);
            res.append(" ");
        }
        System.out.println(res);
        in.close();
    }
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)

双指针

由于 JavaString 是不可变的,所以无法像 C++ 中做到空间 O(1)O(1)。但是,如果所给输入为 char[] 数组,则可以做到“原地算法”,将空间降为 O(1)O(1) (这里假装输入是 char[] :smile:)

思路

  • reverse(char[] arr, int left, int right) 函数:双指针反转 数组区间 arr[left, right]左闭右闭区间
  • 反转每一个单词(空格分隔
    • [I am a boy] --> [I ma a yob]
  • 整体反转全部 arr
    • [I ma a yob] --> [boy a am I]
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        char[] arr = s.toCharArray();
        int n = arr.length;
        int left = 0;
        // 反转每一个单词
        while (left < n) {
            int right = left;
            while (right + 1 < n && arr[right + 1] != ' ') {
                right++;
            }
            reverse(arr, left, right);
            // arr[right]是当前单词的末尾,arr[right + 1]为空格,arr[right + 2]为下一个单词开头(或越界)
            left = right + 2;
        }
        // 整体反转
        reverse(arr, 0, n - 1);
        System.out.println(new String(arr));
        in.close();
    }
    
    // 双指针反转, arr[left, right]
    static void reverse(char[] arr, int left, int right) {
        while (left < right) {
            char temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
}
全部评论

相关推荐

昨天 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务