LeetCode OJ:Reverse Words in a String

本文探讨了如何高效地反转输入字符串中的单词,并详细解释了两种不同的算法实现方式,包括时间复杂度分析和代码实现。

Given an input string, reverse the string word by word.

For example, 
Given s = " the sky is blue ", 
return " blue is sky the ".

  •  这个题目的主要问题是我们输入的string可能包含以下情况:
  • 字符串的结尾或者开头可能包含多个空字符
  • 单词与单词之间可能包含多个空格

看到这个题目我们很容易想到的是:

从最后的非空字符开始遍历,将一个个的单词拿出来保存到临时变量tempstrtng1再逆转,一个个的添加到一个新的字符串tempstring2后面,最后再将该字符串付给s.

这个思路用到了两个临时变量,时间复杂度是O(n).

后来看到一个新的思路:

先翻转整个字符串,然后从前往后一个单词一个单词地再翻转一次,同时去除多余空格,等于是扫描两遍,O(n)。

第一个思路的代码如下:

<span style="font-size:18px;"><pre name="code" class="cpp"><span style="white-space:pre">	</span><pre name="code" class="cpp"><pre name="code" class="plain">void reverseWords(string &s) {
       
    	string sumstring;
         for (int i = s.length()-1; i >= 0; ) {
            while (i >= 0 && s[i] == ' ') i--;
            if(i<0)break;
            if (!sumstring.empty()) sumstring.push_back(' ');
            string tempstring;
             while (i >= 0 && s[i] != ' ') tempstring.push_back(s[i--]);
            reverse(tempstring.begin(), tempstring.end());
            sumstring.append(tempstring);
        }
        s = sumstring;

        
    }</span>
</pre><pre name="code" class="plain">
</pre><pre name="code" class="plain">
</pre><pre name="code" class="plain">
第二种是网上找的:


<span style="font-size:18px;"><pre name="code" class="cpp">  void reverseWords(string &s) {
         reverse(s.begin(), s.end());
         int start = 0, end = 0, j = 0;
         while(start != s.length())
         {
             while(start != s.length() && s[start] == ' ') start ++;
            for(end = start; end != s.length() && s[end] != ' '; end ++);//以上两个步骤将反转后的单词提取出来
             if(j != 0 && start <= end - 1) s[j ++] = ' ';//如果不是第一个单词或最后一个就在后面加上空格
            for(int i = end - 1; start < i; start ++, i --)
                 swap(s[i], s[start]), s[j ++] = s[start];//反转并且移动单词
             while(start < end) s[j ++] = s[start ++];
         }
         s.resize(j);//构造出新的长度为j的字符串
    }</span>




总结:关键STL函数:reserve和resize的运用



内容概要:本文详细介绍了“电动汽车聚合可行域的内-外结合近似方法”的Matlab代码实现,旨在通过数值仿真手段对大规模电动汽车集群作为灵活资源参与电网调度的能力边界进行建模与逼近。该方法融合内部凸包构造与外部约束逼近策略,精确刻画电动汽车在充电状态、功率调节、时间维度等方面的聚合可调能力范围,形成紧致的可行域表示,为高比例电动车接入下的电力系统优化调度、需求响应、车网互动(V2G)等关键应用提供可靠的建模基础。文中强调科研应兼顾严谨逻辑与创新思维,并倡导借助YALMIP等成熟优化工具提升研究效率。完整的代码、工具包及相关案例可通过指定网盘链接和微信公众号“荔枝科研社”获取。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员,尤其适用于从事新能源并网、电动汽车调度、智能电网、综合能源系统等方向的研究生与工程技术人员。; 使用场景及目标:①研究大规模电动汽车集群的聚合建模与灵活性量化方法;②实现电动汽车聚合可行域的内-外近似算法;③支撑含高渗透率电动汽车的电力系统日前-实时协同优化调度;④学习并应用YALMIP工具进行数学规划建模与求解;⑤为需求响应、市场机制设计及V2G运营提供技术支撑。; 阅读建议:建议读者按照文档指引循序渐进学习,结合网盘提供的完整资源(包括YALMIP工具包与示例代码)进行实践调试,重点掌握内-外近似方法的数学建模逻辑、约束处理技巧及优化求解流程,并参考团队发布的其他相关案例,深化对优化算法与仿真技术在能源系统中应用的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值