string类题目(上)

news2024/11/18 1:27:50

string类题目

题目来源(Leetcode)

在这里插入图片描述

题目一:仅仅反转字母

分析

这个反转的特点在于只反转字母,不反转特殊字符。

法一:如果我们让一个正向迭代器指向第一个字符,让一个反向迭代器指向最后一个字符,会有一个问题,它们在相遇的时候,两个迭代器无法比较。迭代器像指针,但不一定是指针。

我们会发现这俩类型都不一样,无法比较。

同时,如果用*it==*rit来判断两者相遇是不行的,因为有可能二者在移动的半途就遇到指向字符相等的情况。

两个都用正向迭代器或反向迭代器,是可以的。一个++,一个–。

但既然如此,不如直接用下标,不用迭代器。其次,范围for也解决不了这个问题。

因为范围for只能正着遍历,不能倒着遍历。

当然这几种可行的方法里没有绝对的好与坏。

这里用一下下标法:

class Solution {
public:
    bool isLetter(char ch)
    {
        if(ch>='a'&&ch<='z')
            return true;
        if(ch>='A'&&ch<='Z')
            return true;
        return false;
    }

    string reverseOnlyLetters(string s) {
        int left=0,right=s.size()-1;
        while(left<right)
        {
            while(left<right&&!isLetter(s[left]))//否则没有字母,left一直走直接越界
            {
                ++left;
            }

            while(left<right&&!isLetter(s[right]))
            {
                --right;
            }

            swap(s[left++],s[right--]);//这里不++和--的话会死循环
        }

        return s;
    }
};

题目二:字符串中的第一个唯一字符

分析

每个字符都和后面其他字符去比较的方法,时间复杂度太差,怎么优化到O(n)呢?

可以用计数排序法

可以统计每个字符出现的次数。

a的ASCII是97,a映射0,b映射1,c映射2,ch-'a’算出相对值,直接就映射到对应位置了,这个字符出现几次就++几次。

还有一个问题是,唯一字符可能有多个,但是我们要求的是第一个。

参考代码:

class Solution {
public:
    int firstUniqChar(string s) {
        int count[26]={0};
        //统计次数
        for(auto ch:s)
        {
            count[ch-'a']++;
        }

        for(size_t i = 0;i<s.size();++i)
        {
            if(count[s[i]-'a']==1)
                return i;
        }

        return -1;
    }
};

这个时间复杂度为O(n),因为我们就遍历了两遍字符串。

题目三:字符串相加

分析

整型就可以相加,但是在一些科研中,整数可能太大了,计算机存不下。long long存到2的64次方,但是可能还是不够大。所以就存到字符串中进行运算。大数运算。

string提供了一套库,从此我们不太需要去用atoi和itoa了:

这个函数可以把字符串转成整型。

这个函数则可以把各种类型转成字符串。

但是我们把给我们的字符串通过stoll转成整型计算完再转回字符串的方式只能对不那么大的数据有用,所以我们不能想着去使用这个捷径。


那么要怎么解决这道题呢?

首先我们要去取这个字符串里的字符,而且要从低位去取,也就是倒着去取。

1024字节是1KB,如果整数的长度是100w(100w长度的整数大小得多大?8个位就已经是亿了,10个位百亿),就才1M空间左右。

最后我们需要往string对象中头插:

single character (6):
iterator insert (iterator p, char c);

代码参考:

class Solution {
public:
    string addStrings(string num1, string num2) {
        string str;
        int end1=num1.size()-1,end2=num2.size()-1;
        int next=0;//进位
        while(end1>=0 || end2>=0)
        {
            int val1=end1>=0?num1[end1--]-'0':0;
            int val2=end2>=0?num2[end2--]-'0':0;
            int ret=val1+val2+next;//每次把进位加上
            
            next=ret/10;
            ret=ret%10;

            str.insert(str.begin(),'0'+ret);//头插到字符串
        }

        if(next==1)//处理没处理的进位
            str.insert(str.begin(),'1');

        return str;
    }
};

但是用头插,时间复杂度会较差,所以用尾插:

这个+=运算符重载就是尾插,底层调用的就是pushback。可以尾插一个字符、一个string。

尾插完后需要逆置,string类中没有,但是STL有:

传的区间必须是左闭右开。

class Solution {
public:
    string addStrings(string num1, string num2) {
        string str;
        int end1=num1.size()-1,end2=num2.size()-1;
        int next=0;//进位
        while(end1>=0 || end2>=0)
        {
            int val1=end1>=0?num1[end1--]-'0':0;
            int val2=end2>=0?num2[end2--]-'0':0;
            int ret=val1+val2+next;//每次把进位加上
            
            next=ret/10;
            ret=ret%10;

            str+=('0'+ret);
        }

        if(next==1)//处理没处理的进位
           str+='1';

        //逆置-STL
        reverse(str.begin(),str.end());

        return str;
    }
};

头插如果遇上较大的数据可能无法通过,insert具有较大的性能消耗。

本文到此结束=_=

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

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

相关文章

如何使用C4D云渲染服务打开图片渲染器窗口?

C4D以其对第三方渲染器的广泛支持而闻名&#xff0c;能够创造出高质量的视觉作品。这些渲染效果涵盖了逼真的光照和阴影效果、真实的材质质感、精细入微的图像细节&#xff0c;以及令人印象深刻的快速渲染能力。C4D云渲染功能进一步增强了其性能&#xff0c;用户可以通过一个统…

Win10用户必备!三款超实用第三方录屏软件大推荐

大家好&#xff01;今天我要和大家分享一下Win10的录屏操作以及使用体验&#xff0c;并且还会推荐几款好用的录屏工具&#xff0c;希望对大家有所帮助。 Win10录屏操作以及使用体验&#xff1a; Win10自带的录屏主要是为游戏录制而开发的&#xff0c;系统自带不需要额外下载客…

拍立淘API返回值:商品搜索与广告推广的完美结合

拍立淘&#xff08;一种基于图像搜索的购物功能&#xff0c;常见于淘宝等电商平台&#xff09;的API&#xff08;应用程序接口&#xff09;返回值在商品搜索与广告推广的结合中扮演了关键角色。这种结合不仅提升了用户体验&#xff0c;还通过精准推荐和广告展示增加了商家的曝光…

DDIA 分布式数据的分区与复制 - 基于 Redis、Kafka、Elasticsearch 的深入分析

引言 本文基于《Designing Data-Intensive Applications》一书&#xff08;设计数据密集型应用&#xff0c;简称 DDIA&#xff09;&#xff0c;深入探讨了 Redis、Kafka 和 Elasticsearch 等常用组件的分区与复制机制。通过这些案例分析&#xff0c;我们可以更好地理解分布式系…

python-竞赛技巧(赛氪OJ)

[题目描述] 在 ACM 竞赛中&#xff0c;当遇到有两个队伍&#xff08;人&#xff09; 解出相同的题目数量的时候&#xff0c;我们需要通过他们解决问题的总时间进行排序。 一共有 N 条时间被以时( Hours )&#xff0c; 分( Minutes )&#xff0c;秒( Seconds )的形式记录。 你必…

​北斗终端:无人驾驶领域的导航新星

一、北斗终端在无人驾驶领域的应用 北斗终端&#xff0c;作为我国自主研发的北斗卫星导航系统的重要组成部分&#xff0c;其在无人驾驶领域中的应用正逐步显现其独特魅力。北斗系统的高精度、高可靠性和良好的抗干扰性能&#xff0c;为无人驾驶车辆提供了精确的定位和导航服务…

生信圆桌x 生信人论坛:生物信息学爱好者的交流与学习社区

介绍 生信人论坛是一个专为生物信息学&#xff08;生信&#xff09;领域的研究人员、学生和爱好者创建的在线社区。在这里&#xff0c;用户可以分享他们的研究经验、讨论最新的生信技术和工具&#xff0c;并向同行请教各种生信分析问题。生信人论坛不仅是一个知识分享的平台&a…

云朵备份:微信的云备份工具

什么是 云朵备份 &#xff1f; 云朵备份 是一个微信云备份程序&#xff0c;使用云朵备份可以将微信数据备份到服务器&#xff0c;通过浏览器访问数据&#xff0c;你可以像正常使用微信一样浏览数据和搜索数据&#xff08;参考微信网页版&#xff09;&#xff0c;除了不能发消息…

3d网格补洞算法

1.RBF径向基函数法 原文链接:https://blog.csdn.net/feengg/article/details/80849516 算法流程:   1.检测孔洞边界   三角网格由一系列顶点 V V V ,以及这些顶点所构成的三角面片 F F F所组成,由三角面片可以得到网格的边 E E E。通常一条边连接两个三角面片,这种边…

Spring横向渗透

这篇文章给师傅们分享下&#xff0c;前段时间的一个渗透测试的一个项目&#xff0c;开始也是先通过各种的手段和手法利用一些工具啊包括空间引擎等站点对该目标公司进行一个渗透测试。前面找的突破口很少&#xff0c;不太好搞&#xff0c;但是后面找到了spring全家桶的相关漏洞…

基于图神经网络的EEG分类

摘要 图神经网络(GNN)越来越多地用于情绪识别、运动想象以及神经疾病等任务的脑电信号(EEG)分类。人们已经提出了一系列方法来设计基于GNN的分类器。因此&#xff0c;有必要对这些方法进行系统回顾和分类。本文对已发表的文献进行了详尽地检索&#xff0c;并总结了几种用于比较…

IT统一运维平台案例

功能模块图 运维平台的架构图&#xff0c;划分为三个主要部分&#xff1a;统一运维门户、报告与决策中心、运维服务调度中心。以下是对每个部分的解析&#xff1a; 1. 统一运维门户 这是用户的统一入口&#xff0c;提供了一系列运维相关的服务和功能&#xff0c;包括&#xf…

艾体宝干货丨Redis与MongoDB的区别

Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务器&#xff09;和 MongoDB 是两类知名的 NoSQL数据库&#xff0c;其以非结构化的方式存储数据。与传统关系数据库使用表格、行和列来组织数据不同&#xff0c;NoSQL数据库采用了不同的数据存储模型。Redis是…

go 系列实现websocket

一、简介 websocket是个二进制协议&#xff0c;需要先通过Http协议进行握手&#xff0c;从而协商完成从Http协议向websocket协议的转换。一旦握手结束&#xff0c;当前的TCP连接后续将采用二进制websocket协议进行双向双工交互&#xff0c;自此与Http协议无关。 二、websocket…

Windows10企业版找不到微软商店以及微软商店打不开问题解决

目录 找不到微软商店解决方案重置缓存安装微软商店 Microsoft Store 无法打开问题 找不到微软商店解决方案 重置缓存 打开设置->应用和功能 找到Microsoft Store(如果没有则需要手动安装),点击高级选项,选择重置,或者管理员下命令行执行 wsreset 安装微软商店 打开 http…

大语言模型-PDF文档解析

PDF解析能够提升大语言模型系统的信息处理能力和应用范围&#xff0c;为用户提供更加便捷、高效、个性化的服务体验。本文介绍三种常用的pdf解析方式&#xff1a;Open Parse、pdfplumber、PyMuPD。 一、Open Parse Open Parse是一个能够直观地识别文档布局并有效地对其进行分…

ruoyi-app前端在缓存中添加nick_name和user_id属性值

需求 ruoyi-app原生自带只有avatar、name、roles、permissions&#xff1b;在显示中&#xff0c;我们大多数需要nick_name、user_id&#xff1b;当然获取方式也可以通过name去调用接口查询&#xff0c;但我想偷个懒。 代码 代码已经调好的&#xff0c;复制即用&#xff1b;至…

中国工商银行笔试2025届考什么?工行笔试备考|附真题库面试攻略

嘿&#xff0c;各位小伙伴们&#xff01;我是职小豚&#xff0c;今天咱们就来好好聊聊中国工商银行 2025 届秋招那些事儿。 一、中国工商银行公司介绍 中国工商银行&#xff0c;那可是金融界的巨擘&#xff01;1984 年 1 月 1 日&#xff0c;它横空出世&#xff0c;开启了辉煌…

浅谈【数据结构】树与二叉树之平衡二叉树

目录 1、平衡二叉树 2、平衡操作 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff01;&#xff01;&#xff…

【与C++的邂逅】--- C/C++内存管理

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 C中我们总是提到管理资源&#xff0c;资源可以从内存中申请&#xff0c;前提是我们得知道C对内存管理的布局&#xff0c;本节我们就来学习这块…