剑指 Offer 58 - I. 翻转单词顺序

这篇具有很好参考价值的文章主要介绍了剑指 Offer 58 - I. 翻转单词顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

剑指 Offer 58 - I. 翻转单词顺序

解法一

不用内置方法

  1. 去除首尾空格和中间多余空格
  2. 翻转所有字符
  3. 翻转每个单词
class Solution {
    public String reverseWords(String s) {
        // 去除首尾空格和中间多余空格
        char[] ch = trim(s);
        // 翻转所有字符
        reverse(ch, 0, ch.length - 1);
        // 翻转每个单词
        reverseWord(ch);
        return new String(ch);
    }

    char[] trim(String s){
        StringBuilder sb = new StringBuilder();
        int l = 0, r = s.length() - 1;
        while(l <= r && s.charAt(l) == ' ') l++;
        while(l <= r && s.charAt(r) == ' ') r--;
        for(int i = l; i <= r; i++){
            if(s.charAt(i) != ' ') sb.append(s.charAt(i));
            else {
                if(s.charAt(i + 1) != ' ') sb.append(' ');  // 只加入连续空格的最后一个
            }
        } 
        return sb.toString().toCharArray(); 
    }

    void reverseWord(char[] ch){
        int l = 0, r = 0;
        while(r < ch.length){
            while(r < ch.length && ch[r] != ' ') r++;
            reverse(ch, l, r - 1);
            l = r + 1;
            r = r + 1;
        }
    }

    void reverse(char[] ch, int l, int r){
        while(l < r){
            char tmp = ch[l];
            ch[l] = ch[r];
            ch[r] = tmp;
            l++;
            r--;
        }
    }
}

解法二

用自带的 trim()substring(),要自己实现这两个方法也很简单。文章来源地址https://www.toymoban.com/news/detail-669905.html

class Solution {
    public String reverseWords(String s) {
        s = s.trim();  // 删除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0){
            while(i >= 0 && s.charAt(i) != ' ') i--;  // 搜索首个空格
            res.append(s.substring(i + 1, j + 1) + " ");  // 添加单词
            while(i >= 0 && s.charAt(i) == ' ') i--;  // 跳过单词间空格
            j = i;  // j 指向下个单词的尾字符
        }
        return res.toString().trim();  // 转化为字符串并返回
    }
}

到了这里,关于剑指 Offer 58 - I. 翻转单词顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指 Offer 56 - I. 数组中数字出现的次数

    理想的人物不仅要在物质需要的满足上,还要在精神旨趣的满足上得到表现。        —— 黑格尔 目录 方法1:排序+指针 方法2:异或整个数组 题目: 一个整型数组  nums  里除两个数字之外,其他数字都出现了 两次 。请写程序找出这两个 只出现一次的数字。 要求时间复

    2023年04月16日
    浏览(37)
  • 力扣 [344、541、剑指offer 05.、151、剑指offer58-ll]

    双指针:自己的 双指针,左指针指向开头,右指针指向末尾。 交换两个左右指针。 左右指针向中间移动。 时间复杂度:O(n); 空间复杂度:O(1); 实现代码: 分类讨论:自己的 分类讨论: 如果剩余字符少于k个,则将剩余字符全部反转。 如果剩余字符大于或等于k个,则反

    2024年02月15日
    浏览(37)
  • 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目来源 剑指 Offer 53 - I. 在排序数组中查找数字 I 初始化: 左边界 i=0 ,右边界 j=nums.length−1。 循环二分: 当闭区间 [i, j] 无元素时跳出; 计算中点 m=(i+j)/2 (向下取整); 若 nums[m]target,则 target 在闭区间 [m+1,j] 中,因此执行 i=m+1; 若 nums[m]target,则 target 在闭区间 [i,m−

    2024年02月01日
    浏览(39)
  • (动态规划) 剑指 Offer 10- I. 斐波那契数列 ——【Leetcode每日一题】

    难度:简单 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) )。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计

    2024年02月12日
    浏览(51)
  • Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树:  [3,9,20,null,null,15,7] ,     3    /   9  20     /     15   7 返回: [3,9,20,15,7] 提示: 节点总数 = 1000 1.题目要求我们从上到下打印出二叉树的每个节点,同一层的节点按照从左

    2024年02月12日
    浏览(47)
  • (树) 剑指 Offer 32 - I. 从上到下打印二叉树 ——【Leetcode每日一题】

    难度:中等 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回: 提示 : 节点总数 = 100 💡思路:BFS 使用 优先队列 进行 层序遍历 即可! 🍁代码:(C++、Java) C++ Java 🚀 运行结果: 🕔 复杂度分析: 时间

    2024年02月14日
    浏览(37)
  • 剑指Offer--05替换空格&&58左旋字符串

    题目是这样的 意思是将字符串s中的空格替换为字符串\\\"%20\\\",如果只是替换一个字符还好,可以在原数组直接替换,但是是将空格替换为字符串,所以再在原数组上替换,原数组原内容会被覆盖,且长度大小不够,所以此时要动态开辟一个字符数组,这个数组开多大?考虑最坏

    2024年02月06日
    浏览(47)
  • LeetCode:剑指 Offer 58 - II. 左旋转字符串

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋

    2024年02月02日
    浏览(46)
  • 每天一道leetcode:剑指 Offer 53 - I. 在排序数组中查找数字 I(适合初学者&二分查找)

    统计一个数字在排序数组中出现的次数。 0 = nums.length = 10^5 -10^9 = nums[i] = 10^9 nums 是一个非递减数组 -10^9 = target = 10^9 使用两次二分查找找到target在数组中的左右边界,然后长度就是右边界减去左边界再加一,最后返回长度即可。   欢迎大家在评论区讨论,如有不懂的代码部分

    2024年02月14日
    浏览(54)
  • 剑指 Offer 59 - I. 滑动窗口的最大值 / LeetCode 239. 滑动窗口最大值(优先队列 / 单调队列)

    链接:剑指 Offer 59 - I. 滑动窗口的最大值;LeetCode 239. 滑动窗口最大值 难度:困难 下一篇:剑指 Offer 59 - II. 队列的最大值(单调队列) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包