已解决
【C++】STL容器——string类的例题应用(9)
来自网友在路上 166866提问 提问时间:2023-10-25 05:40:13阅读次数: 66
最佳答案 问答题库668位专家为你答疑解惑
前言
大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎!本章主要内容面向接触过C++的老铁,下面是收纳的一些例题与解析~
主要内容含:
欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门!
目录
- 【例1]给一个字符串(包含字母与数字),将字符串翻转【访问string的size与对象】
- 【例2]验证一个字符串是否是回文【范围for遍历字符串】
- 【例3]找字符串中第一个只出现一次的字符【计数】
- 【例4]输入一个字符串,求字符串里面最后一个单词的长度【getline函数的应用】
- 【例5】将两个字符串相加(ASCALL码相加)【reverse函数,+=,insert】
【例1]给一个字符串(包含字母与数字),将字符串翻转【访问string的size与对象】
- 如给定“123asd222zxc”,反转后得到“123cxz222dsa”
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) {if(S.empty())return S;size_t begin = 0, end = S.size()-1;while(begin < end){while(begin < end && !isLetter(S[begin]))++begin;while(begin < end && !isLetter(S[end]))--end;swap(S[begin], S[end]);++begin;--end;}return S;}}
【例2]验证一个字符串是否是回文【范围for遍历字符串】
class Solution {
public:bool isLetterOrNumber(char ch)//是否是字母{return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}bool isPalindrome(string s) {for(auto& ch : s)//范围for,遍历字符串{if(ch >= 'a' && ch <= 'z')// 先小写字母转换成大写,再进行判断ch -= 32;}int begin = 0, end = s.size()-1;while(begin < end){while(begin < end && !isLetterOrNumber(s[begin]))++begin;while(begin < end && !isLetterOrNumber(s[end]))--end;if(s[begin] != s[end]){return false;}else{++begin;--end;}}return true;}
};
【例3]找字符串中第一个只出现一次的字符【计数】
class Solution {
public:int firstUniqChar(string s){// 统计每个字符出现的次数int count[256] = {0};int size = s.size();for(int i = 0; i < size; ++i)count[s[i]] += 1;// 按照字符次序从前往后找只出现一次的字符for(int i = 0; i < size; ++i)if(1 == count[s[i]])return i;return -1;}
};
【例4]输入一个字符串,求字符串里面最后一个单词的长度【getline函数的应用】
- getline函数有两种不同的形式,这也就对应着字符串的 结束方式
- getline函数原型:getline(std::cin,string ch),表示以换行符 ‘\n’ 结束字符串的读入
- getline函数原型 getline(std::cin,string s,char ch),表示以字符ch来结束字符串的读入
- 功能: 无视空格,读取输入屏幕的字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{string line;// 不要使用cin>>line,因为会它遇到空格就结束了// while(cin>>line)while(getline(cin, line)){size_t pos = line.rfind(' ');cout<<line.size()-pos-1<<endl;}return 0;
}
【例5】将两个字符串相加(ASCALL码相加)【reverse函数,+=,insert】
- 题目如下所示:
- 两个字符串相加的规定是,ASCALL码值相加
- 开始前,我们要清楚明白,该题目需要遍历两个字符串
- 有两种思路: 从前往后相加,+=尾插以后再reverse过来(代码片所用方法) 或者从后往前相加,相加的结果到字符串可以使用insert头插
- 我们先考虑分别遍历一位的情况,后面要采用while循环
- (1)遍历字符串的同时,分别取数,将字符的ASCALL通过-“0”,转换成整型
- (2)取数完的同时分别相加,考虑进位
- (3)最后再+“0”,重新转换成字符,形成字符串
class Solution {
public:string addstrings(string num1, string num2)
{int end1 = num1.size()-1;int end2 = num2.size()-1;int value1 = 0, value2 = 0, next = 0;//核心设置:string addret;//形成的新串存放在其中while(end1 >= 0 || end2 >= 0){if(end1 >= 0)value1 = num1[end1--]-'0';elsevalue1 = 0;if(end2 >= 0)value2 = num2[end2--]-'0';elsevalue2 = 0;int valueret = value1 + value2 + next;//next为进位,value1,value2为单次循环中分别的取数if(valueret > 9){next = 1;valueret -= 10;}else{next = 0;}//addret.insert(addret.begin(), valueret+'0');addret += (valueret+'0');}// 从后往前相加,相加的结果到字符串可以使用insert头插// 或者+=尾插以后再reverse过来if(next == 1){//addret.insert(addret.begin(), '1');addret += '1';}reverse(addret.begin(), addret.end());return addret;}
};
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"【C++】STL容器——string类的例题应用(9)":http://eshow365.cn/6-23938-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!