当前位置: 首页 > news >正文

DAY 42 leetcode 151--哈希表.反转字符串中的单词

题号151

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

我的解法

暴力解法,先将String转为字符数组,遍历找出空格所在地,然后再倒着将其加入,然后在这个过程中加上各种条件限制

class Solution {
    public String reverseWords(String s) {
        char[]arr=s.toCharArray();
        int count=0;
        ArrayList<Integer> list=new ArrayList<>();
        if(arr.length==1)
        return s;
        for(int i=0;i<arr.length-1;i++){
            if(arr[0]!=' '&&count==0)
            {
                list.add(-1);
                count++;
            }
            if(arr[i]==' '&&arr[i+1]!=' ') {
                list.add(i);
                count++;
            }
        }
        ArrayList<String> clist=new ArrayList<>();

           for(int i=count-1;i>=0;i--) {
               int j = list.get(i);
               while (j+1<arr.length&&arr[j+1] != ' ') {
                   clist.add(String.valueOf(arr[j+ 1]));
                   j++;
               }
               if(i!=0)
                clist.add(" ");
           }
        String ans="";
        for(String str:clist){
            ans+=str;
        }
        
        return ans;
    }
}

另解:

class Solution {
    public String reverseWords(String s) {
        //先删除空格
        StringBuilder str=delSpace(s);

        //再反转字符串
        str.reverse();
        
        //再反转子串
        myreserve(str);

        return str.toString();//转为string类返回
    }
    public  StringBuilder delSpace (String s){
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }

        // 将字符串间多余的空白字符去除
        StringBuilder sb = new StringBuilder();
        while (left <= right) {
            char c = s.charAt(left);

            if (c != ' ') {
                sb.append(c);
            } else if (sb.charAt(sb.length() - 1) != ' ')
            //如果当前字符是空格,且sb中前一个字符不是空格则加入
            {
                sb.append(c);
            }

            ++left;
        }
        return sb;

    }
    public StringBuilder myreserve(StringBuilder s){
        int i=0;
        int j=0;
        while(j<s.length()){

            if(s.charAt(j)!=' ')
                j++;
            else {
                myreserve1(s, i, j - 1);
                j++;
                i = j;
            }
        }
        //反转最后一个单词
        myreserve1(s,i,j-1);

        return s;

    }
    public StringBuilder myreserve1(StringBuilder s,int a,int b){
        int slow=a;
        int fast=b;
        while(slow<fast){
            //反转操作(首尾交换)
            char tmp=s.charAt(slow);
            s.setCharAt(slow,s.charAt(fast));
            s.setCharAt(fast,tmp);
            slow++;
            fast--;
        }
        return s;
    }
}

思路:先删除空格,再整个反转,最后逐一反转

再另解

class Solution {
    public String reverseWords(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }

        Deque<String> d = new ArrayDeque<String>();
        StringBuilder word = new StringBuilder();
        
        while (left <= right) {
            char c = s.charAt(left);
            if ((word.length() != 0) && (c == ' ')) {
                // 将单词 push 到队列的头部
                d.offerFirst(word.toString());
                word.setLength(0);
            } else if (c != ' ') {
                word.append(c);
            }
            ++left;
        }
        d.offerFirst(word.toString());

        return String.join(" ", d);
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/194450/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用一个双端队列,将字符串依次压入队列的头部即可

相关文章:

  • 危化品安全员岗位注意事项有哪些?
  • Downlink Sensing in 5G-Advanced and 6G: SIB1-assisted SSB Approach
  • 深度剖析SSD多段L2P表查找加速技术
  • 解锁AI未来,开启创新之旅——《GPTs开发详解》与《ChatGPT 4应用详解》两本书的深度解析
  • dbVisitor 规则怎么用?
  • VSCode会击败Cursor和Windsurf吗?
  • 【Python技术生态全景:十大核心应用领域深度解析】
  • [Android] PDF编辑器 Xodo PDF Reader 9.13.3 (不完全汉化,能用)
  • 04-算法打卡-数组-二分查找-leetcode(69)-第四天
  • 技术随笔《二》:人形机器人模仿学习与传统控制方法概述
  • 关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结
  • Python-控制语句
  • 热管理设计与 PCBA 长期可靠性的深度关联
  • 让DeepSeek API支持联网搜索
  • Lock 与 Synchronized:Java 并发控制的深度对比与实践
  • 什么是继承?js中有哪儿些继承?
  • 基于RISC-V内核的嵌入式系统在机器人关节控制中的应用研究
  • 1. CEF 下载及wrapper编译
  • 第四篇:Python文件操作与异常处理
  • PromptUp 网站介绍:AI助力,轻松创作
  • 万网做网站花多少钱/搜索引擎优化的缺点包括
  • 网站开发ppt模板/平台代运营是什么意思
  • 上海电子通科技网站建设/厦门关键词优化seo
  • 什么系统做购物网站好/我是seo关键词
  • 域名租赁网站/郑州百度seo关键词
  • 同城招聘网站自助建站/自助建站申请