首页 > 其他分享 >剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串

时间:2023-09-05 19:44:31浏览次数:36  
标签:单词 20 idx Offer int 空格 字符串 size

说实话本题虽然不难,但是对边界问题的处理超乎想象(一不小心就越界访问),”简单“的难度还是说明博主本身太菜了。

本题的主要考点是双指针以及对标准库(对c++来说)一些函数的运用。

处理的中心思想是:先将整个字符串反转,而后再通过双指针提取其中的各个单词,而后再将其反转

这样的处理的优点是,不用开辟额外的空间。首先确定idx(新的单词插入的位置),而后将单词插入即可。

class Solution {
public:
    string reverseWords(string s) {
        // 作为边界条件,首要考虑的是空字符串
        // 以及全部为空格的字符串
        if(s.size() == 0) return "";
        int i = 0;
        while(i < s.size() && s[i] == ' ') {
            ++ i;
        }
        if(i == s.size()) return "";

        // 去除头部和尾部的空格
        s.substr(i);
        while(s.back() == ' ') s.pop_back();

        // 先对整个字符串翻转,而后针对里面的单个word进行翻转
        // 这样做的好处是不用申请额外的内存
        reverse(s.begin(), s.end());
        
        // string tmp;
        // string res;
        int idx = 0; // idx代表着去掉单词间多余空格的新字符串的索引
        int n = s.size();
        for(int i = 0; i < n; i ++ ) {
            // 如果是空格,让i自动加,不做处理
            if(s[i] == ' ') continue;
            // 如果idx从0开始,那么不用加空格
            // 否则就是两个单词之间,需要加空格
            // 最后单词末尾是不会加上空格的,因为此时i=s.size(),是不会进入循环条件的
            if(idx != 0) {
                s[idx] = ' '; 
                ++ idx;
            }

            // 循环遍历至单词的末尾
            // i表示当前单词起始位置,j和idx是单词结束位置后的一个空格处
            int j = i;
            while(j < n && s[j] != ' ') {
                s[idx] = s[j];
                ++ j;
                ++ idx;
            }

            // 反转整个单词
            // idx此时在单词的末尾空格处,j - i表示单词的长度
            // 注意,idx和j、i不一定相等,因为有可能单词之间有很多空格存在,idx <= i <= j
            reverse(s.begin() + idx - (j - i), s.begin() + idx);

            // 更新i,去找下一个单词
            i = j;
        }
        // 将后面的多余的去掉
        s.erase(s.begin() + idx, s.end());
        return s;
    }
};

下面是我自己运用string字符串标准库的一些收获:

1.  字符串后面拼接字符直接+即可,append适用于字符串后面拼接字符串。

2. 一旦涉及到字符串去掉空格的操作时,下面的模板能有效去除字符串的前后空格

int main(string s) {
  if(s.size() == 0) return ""; // 如果字符串为空,根据题意返回
  int i = 0;
  while(s[i] == ' ') ++i;
  if(i == s.size()) return ""; // 如果字符串全部是空格,根据题意返回
  s.substr(i); // 去掉s前面的空格
  while(s.back() == ' ') s.pop_back(); // 去掉s后面的空格          
  ...  
}

 

标签:单词,20,idx,Offer,int,空格,字符串,size
From: https://www.cnblogs.com/luxiayuai/p/17680641.html

相关文章

  • 在 PHP 数组中的两个字符串之间切换
    在PHP中,你可以使用array_flip()函数和条件语句来在数组中的两个字符串之间进行切换。以下是一个示例://创建一个数组,包含两个字符串的映射关系$mapping=array('string1'=>'value1','string2'=>'value2');//定义当前需要切换的字符串$currentString='string......
  • 【愚公系列】2023年09月 WPF控件专题 Calendar控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • 找质数(图算法)、交错字符串(字符串、动态规划)、有效数字(字符串)
    找质数(图算法)找出大于200的最小的质数解答:importjava.util.*;importjava.lang.*;importjava.io.*;classIdeone{publicstaticvoidmain(String[]args)throwsjava.lang.Exception{intn=201;while(true){booleanb=tru......
  • [VLDBJ 2019]Distributed Subgraph Matching on Timely Dataflow
    [VLDBJ2019]DistributedSubgraphMatchingonTimelyDataflow只关注这篇中的subgraphmatching的内容定义\(g=(V_g,E_g,L_g)\)分别表示点、边,以及把任意点或边映射成label的函数。如果是无标签图则会映射为空。对于任意点\(\mu\inV_g\),定义\(N_g(\mu)\)为它的邻居节......
  • 2023/9/5 虹日刊 关键词:数字化零售
    ......
  • Visual Studis 2019添加解决方案文件夹报错:未将对象引用设置到对象的实例
      原来是可以创建解决方案文件夹的,也不知道是不是使用了vs管理插件。 vs创建的解决方案文件夹是虚拟的,所以需要后台创建一个,vs创建一个。 目前解决方案:1、先创建解决方案文件夹,报错也没关系,默认文件夹名 2、打开解决方案文件  3、修改默认的那个解决方案......
  • sqlserver中怎么将一列数据拼接成一个字符串
     SELECTb.name+','FROM dbo.TechnologyColorajoin[dbo].[CustomColor]b ona.customcolorid=b.id WHEREProductId=345882800324677FORxmlPATH('')SELECT需要合并的字段+','FROM表名FORXMLPATH(''......
  • 模板字符串
    点击查看代码functionrender(template,data){constreg=/\{\{(\w+)\}\}/;//模板字符串正则if(reg.test(template)){//判断模板⾥是否有模板字符串constname=reg.exec(template)[1];//查找当前模板⾥第⼀个模板字符串的字段template=template.replace(reg,......
  • 字符串的复制
    classString{private:char*m_Buffer;unsignedintm_Size;public:String(constchar*string){//首先constchar*等同于stringm_Size=int(strlen(string));//因为64位的strlen是unisignedlongm_Buffer=newchar[m_Si......
  • Ynoi2015 我回来了
    介绍个最劣解\(O(m\sqrtn+n\sqrtn+n\alpha(n)\lnn)\)做法。首先令\(b_i\getsa_i-1\),区间\([l,r]\)的答案就是:\[r-l+1+\sum\limits_{k=l}^r\text{mex}_{i=l}^r\left\lfloor\frac{b_i}{k}\right\rfloor\]考虑如何动态维护后面那个式子。我们对每一个\(k\in[1,n]\)维......