算法的学习笔记—翻转单词顺序列(牛客JZ73)

news2024/10/28 4:50:36

在这里插入图片描述

img

😀前言
在《剑指 Offer》系列题中,有一道关于翻转单词顺序的经典题目。给定一个由多个单词组成的字符串,需要将每个单词的顺序颠倒。这道题考察了对字符串的操作技巧,尤其是如何在限定空间内完成字符串的翻转。本文将详细解析这道题的解题思路,并提供代码实现。

🏠个人主页:尘觉主页

文章目录

  • 🥰翻转单词顺序列
    • 😊题目链接
    • ❤️‍🔥题目描述
    • 💓解题思路
      • 隐含条件
    • 💞实现代码
      • 代码解析
      • 示例运行
    • 时间复杂度分析
    • 😄总结

🥰翻转单词顺序列

😊题目链接

牛客网

❤️‍🔥题目描述

给定一个字符串,其包含若干个单词(单词之间由一个空格分隔),请将字符串中单词的顺序翻转。例如:

  • 输入"I am a student."
  • 输出"student. a am I"

💓解题思路

本题的关键在于 逐步翻转字符串。一种有效的解法是分为以下几个步骤:

  1. 翻转每个单词:通过遍历字符串,将每个单词分别翻转。这样每个单词的字符顺序会变为逆序。
  2. 整体翻转:在每个单词都逆序的基础上,翻转整个字符串。这样就达到了将单词顺序颠倒的效果。

这类似于 两次翻转 的操作:第一次翻转每个单词的字符顺序,第二次翻转整个字符串的顺序。

隐含条件

题目隐含了一个条件,即尽量不要使用额外的空间。如果不借助辅助空间(如额外的数组),则在原字符串上进行字符交换会显得更高效。

💞实现代码

以下是 Java 实现代码:

public class ReverseSentence {

    public String ReverseSentence(String str) {
        int n = str.length();
        char[] chars = str.toCharArray(); // 将字符串转换为字符数组
        int i = 0, j = 0;
        
        // 翻转每个单词
        while (j <= n) {
            if (j == n || chars[j] == ' ') { // 遇到空格或末尾时,翻转单词
                reverse(chars, i, j - 1);
                i = j + 1; // 更新 i 到下一个单词的开头
            }
            j++;
        }
        
        // 翻转整个字符串
        reverse(chars, 0, n - 1);
        
        return new String(chars); // 将字符数组转换回字符串
    }

    private void reverse(char[] c, int i, int j) {
        while (i < j) {
            swap(c, i++, j--); // 交换字符,实现翻转
        }
    }

    private void swap(char[] c, int i, int j) {
        char t = c[i];
        c[i] = c[j];
        c[j] = t;
    }

    public static void main(String[] args) {
        ReverseSentence rs = new ReverseSentence();
        String input = "I am a student.";
        
        String result = rs.ReverseSentence(input);
        
        System.out.println(result); // 输出:"student. a am I"
    }
}

代码解析

  • 变量定义chars 是字符串的字符数组,用来保存中间结果;ij 分别用于标记每个单词的起始和结束位置。
  • 逐个翻转单词:通过 while 循环和条件判断,当遇到空格或字符串结尾时,调用 reverse 函数翻转单词。
  • 整体翻转:在所有单词都翻转完后,对整个字符数组进行翻转,实现单词顺序的颠倒。
  • 辅助方法 reverse:用于在给定的起始和结束索引之间反转字符顺序。
  • 辅助方法 swap:用于交换两个字符,帮助 reverse 方法实现翻转。

示例运行

在上述代码中,若输入为 "I am a student.",代码会执行以下几步:

  1. 翻转每个单词:
    • "I" -> "I"
    • "am" -> "ma"
    • "a" -> "a"
    • "student." -> ".tneduts"
  2. 整体翻转字符数组,得到结果:"student. a am I"

最终输出 "student. a am I"

时间复杂度分析

该算法的时间复杂度为 O(n),其中 n 为字符串的长度。我们对每个字符至多只访问两次(一次翻转单词,一次整体翻转),因此效率较高。

😄总结

本题使用了 双重翻转 的方法,巧妙地实现了翻转单词顺序的效果。通过这个思路,可以在不使用额外空间的情况下,完成对字符串的高效处理。在面试中,掌握该解法对于处理其他字符串类问题也有很大帮助。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吉客云与金蝶云星空系统高效数据对接实践

调拨出库红字对接分步式调入(退货)案例分享&#xff1a;吉客云数据集成到金蝶云星空 在企业的日常运营中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化和优化的重要环节。本文将聚焦于一个具体的系统对接集成案例——如何将吉客云的数据无缝集成到金蝶云星空&…

阿里云物联网的通信方式

阿里云物联网通信的两种方式&#xff0c;一个是物模型&#xff08;分为服务&#xff0c;事件&#xff0c;属性&#xff09;&#xff0c;一个是自定义topic&#xff08;要另外设置数据流转&#xff09; 1.使用产品内的功能定义&#xff0c;&#xff08;其实也就是Topic中定义好的…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

重学SpringBoot3-Spring WebFlux之SSE服务器发送事件

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE&#xff1f;2. Spring Boot 3 响应式编程与 SSE为什么选择响应式编程实现 SSE&#xff1f; 3. 实现 SSE 的基本步骤3.…

【JavaEE】【多线程】volatile,wait/notify

目录 一、volatile关键字1.1 内存可见性1.2 volatile解决内存可见性问题 二、wait和notify2.1 wait2.2 notify2.3 使用例子2.3.1 例子12.3.2 例子二 一、volatile关键字 volatile可以保证内存可见性&#xff0c;只能修饰变量。 1.1 内存可见性 在前面介绍线程不安全原因时介…

AI编译器与TVM

由于AI芯片的特殊性和高度定制化&#xff0c;为了兼容硬件的多样性&#xff0c;AI模型必须能被高效地映射到各种AI芯片上。AI编译器将深度学习框架描述的AI模型作为输入&#xff0c;将为各种AI芯片生成的优化代码作为输出。AI编译器的目标是通过编译优化的方法将深度学习框架产…

Git的原理和使用(六)

本文主要讲解企业级开发模型 1. 引入 交付软件的流程&#xff1a;开发->测试->发布上线 上面三个过程可以详细划分为一下过程&#xff1a;规划、编码、构建、测试、发 布、部署和维护 最初&#xff0c;程序⽐较简单&#xff0c;⼯作量不⼤&#xff0c;程序员⼀个⼈可以完…

2025 - AI人工智能药物设计 - 中药网络药理学和毒理学的研究

中药网络药理学和毒理学的研究 TCMSP&#xff1a;https://old.tcmsp-e.com/tcmsp.php 然后去pubchem选择&#xff1a;输入Molecule Name 然后进行匹配&#xff1a;得到了smiles 再次通过smiles&#xff1a;COC1C(CC(C2C1OC(CC2O)C3CCCCC3)O)O 然后再次输入&#xff1a;http…

单体架构VS微服务架构

单体架构&#xff1a;一个包含有所有功能的应用程序 优点&#xff1a;架构简单、开发部署简单缺点&#xff1a;复杂性高、业务功能多、部署慢、扩展差、技术升级困难 如上示意图&#xff0c;应用前端页面&#xff0c;后台所有模块功能都放在一个应用程序中&#xff0c;并部署在…

「C/C++」C++标准库之#include<fstream>文件流

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

shodan2---清风

注&#xff1a;本文章源于泷羽SEC&#xff0c;如有侵权请联系我&#xff0c;违规必删 学习请认准泷羽SEC学习视频:https://space.bilibili.com/350329294 实验一&#xff1a;search 存在CVE-2019-0708的网络设备 CVE - 2019 - 0708**漏洞&#xff1a;** 该漏洞存在于远程桌面…

MedSAM微调版,自动生成 Prompt 嵌入实现图像分割!

最近提出的Segment Anything Model (SAM)等基础模型在图像分割任务上取得了显著的成果。 然而&#xff0c;这些模型通常需要通过人工设计的 Prompt &#xff08;如边界框&#xff09;进行用户交互&#xff0c;这限制了它们的部署到下游任务。 将这些模型适应到具有完全 Token 数…

Arduino Uno 同时控制多路舵机

Arduino Uno同时控制4个舵机 舵机可以在0~180度内指定角度的控制。常用于航模、机器人、遥控玩具等物品,然而,很多时候要一次性控制多个舵机,今天以控制4个舵机为例进行说明 接线方式如下图: 舵机的信号线分别接A0,A1,A2,A3。控制舵机从0旋转到180度,再由180度旋转到0度,…

从0开始深度学习(18)——层和块

1 层和块 1.1层 层是神经网络的基本组成单位。每一层由多个神经元&#xff08;或单元&#xff09;组成&#xff0c;这些神经元在前一层的输出上执行某种计算&#xff0c;并将结果传递给下一层。根据功能&#xff0c;层可以分为以下几种类型&#xff1a; 输入层&#xff08;I…

《决策思维:人人必备的决策口袋书》

本书干货很多&#xff0c;十分值得一读。但受众不是一线员工与一线管理者&#xff0c;更多的倾向于管理者的管理者。一线员工读完的最大收获是可以理解老板的决策逻辑与思维方式&#xff0c;便于更好的去做执行。同时&#xff0c;还能帮助判断老板的决策是否正确&#xff0c;是…

【Android】view的基础知识

文章目录 View与ViewGroupView位置参数View的滑动1. scrollTo与scrollBy2. 属性动画ObjectAnimatorViewPropertyAnimator 3. LayoutParams&#xff08;布局参数&#xff09;layout方法offsetLeftAndRight View的弹性滑动1. Scroller 类2. 动画&#xff08;ObjectAnimator&#…

SYN590RL 300MHz至450MHz ASK接收机芯片IC

一般描述 SYN590RL是赛诺克全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容&#xff0c;灵敏度达到典型-110dBm&#xff0c;300MHz”450MHz 频率范围应用的单芯片ASK或OOK射频接收器。 SYN59ORL是一款典型的即插即用型单片高集成度无线接收器&…

Spring Boot实现的动态化酒店住宿管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…

pytorch的标签平滑介绍

什么是标签平滑(Label Smoothing)? 标签平滑(Label Smoothing)是一种正则化技术,旨在防止模型过度自信(即输出的概率分布过于“尖锐”)。在分类任务中,标准的目标标签是one-hot编码,也就是正确类别的概率为 1,其他类别的概率为 0。而标签平滑通过将正确类别的概率从…

绝了,这款播放器让发烧友疯狂种草,堪称音乐神器

作为音乐爱好者的不二之选&#xff0c;foobar2000凭借其卓越的音频处理能力&#xff0c;在Windows系统用户中树立了极高的声誉。这款轻量级播放器的设计理念是将极致的性能与个性化完美结合。用户可以根据自己的使用习惯&#xff0c;打造出独具特色的播放界面和操作流程。在音频…