首页 > 其他分享 >剑指 Offer 58 - I. 翻转单词顺序

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

时间:2023-09-03 21:38:21浏览次数:36  
标签:trim 单词 ch String Offer 58 空格 翻转


剑指 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(),要自己实现这两个方法也很简单。

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();  // 转化为字符串并返回
    }
}


标签:trim,单词,ch,String,Offer,58,空格,翻转
From: https://blog.51cto.com/u_16208057/7343317

相关文章

  • 剑指 Offer 59 - I. 滑动窗口的最大值
    剑指Offer59-I.滑动窗口的最大值单调队列在增删元素的过程中要求能返回当前最大元素,和155.最小栈类似。classSolution{publicint[]maxSlidingWindow(int[]nums,intk){intn=nums.length,p=0;int[]res=newint[n-k+1];......
  • 剑指 Offer 59 - II. 队列的最大值
    剑指Offer59-II.队列的最大值就是题目剑指Offer59-I.滑动窗口的最大值需要实现的数据结构。一个队列用于正常加入和删除数据,另一个队列用于维护最大值。classMaxQueue{Deque<Integer>q=newArrayDeque<>();Deque<Integer>q_max=newArrayDeque<>();......
  • 剑指 Offer 58 - II. 左旋转字符串
    剑指Offer58-II.左旋转字符串翻转前n个字符翻转其余字符翻转所有字符classSolution{publicStringreverseLeftWords(Strings,intn){char[]ch=s.toCharArray();reverse(ch,0,n-1);reverse(ch,n,ch.length-1);rever......
  • 剑指 Offer 64. 求1+2+…+n
    剑指Offer64.求1+2+…+n使用逻辑运算符的短路效应代替终止条件。classSolution{intres=0;publicintsumNums(intn){booleanx=n>1&&sumNums(n-1)>0;res+=n;returnres;}}......
  • 剑指 Offer 60. n个骰子的点数
    剑指Offer60.n个骰子的点数动态规划:已知n-1个骰子的所有情况,再增加一个骰子,可推出n个骰子的所有情况。增加的一个骰子的点数只有1-6种可能,与n-1个骰子对应点数相乘,可得到n个骰子点数的一种情况,遍历所有情况即可。classSolution{publicdouble[]dicesProbability(intn)......
  • 剑指 Offer 06. 从尾到头打印链表
    剑指Offer06.从尾到头打印链表方法一顺序添加,再翻转。classSolution{publicint[]reversePrint(ListNodehead){ListNodeh=head;List<Integer>res=newArrayList<>();while(h!=null){res.add(h.val);h=......
  • 剑指 Offer 03. 数组中重复的数字
    剑指Offer03.数组中重复的数字利用题目的限制条件:所有数字都在0~n-1的范围内通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。classSolution{publicintfindRepeatNumber(int[]nums){intn=nums.length;inti=0;......
  • 剑指 Offer 62. 圆圈中最后剩下的数字(简单)
    题目:classSolution{public:intlastRemaining(intn,intm){intpos=0;for(inti=2;i<=n;i++){pos=(pos+m)%i;}returnpos;}};作者:想吃火锅的木易链接:https://leetcode.cn/problems/yuan-quan-zhong-z......
  • 剑指offer_20230803
    剑指Offer51.数组中的逆序对题目说明在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路1:暴力肯定是可行但是会超时的,就不用考虑了,但理论可行解题思路2:归并可以利用归并排序时的一个特性......
  • leetcode226 翻转二叉树——简单
      #Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:definvertTree(self,root):......