【C++】string类练习

embedded/2024/11/29 4:04:47/

test1:反转字母

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。
  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s 。

示例 1:

输入:s = "ab-cd"
输出:"dc-ba"

示例 2:

输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3:

输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

提示

  • 1 <= s.length <= 100
  • s 仅由 ASCII 值在范围 [33, 122] 的字符组成
  • s 不含 '\"' 或 '\\'
void swap(char* c1, char* c2)
{char c = *c1;*c1 = *c2;*c2 = c;
}bool isLetter(char c)
{if ('a' <= c && c <= 'z')return true;if ('A' <= c && c <= 'Z')return true;return false;
}class Solution {
public:string reverseOnlyLetters(string s) {int begin = 0, end = s.size() - 1;while (begin < end){while (!isLetter(s[begin]) && begin < end)从左遍历字符串遇到直到字母,
//begin<end为了防止"#¥%&*¥#@"该字符串没有字母,循环不能终止,直至越界访问{begin++;}while (!isLetter(s[end]) && begin < end){end--;}swap(s[begin], s[end]);begin++;end--;}return s;}
};

test2:字符串中第一个唯一出现字符

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

提示:

  • 1 <= s.length <= 105
  • s 只包含小写字母
class Solution {
public:int firstUniqChar(string s) {int count[27] = { 0 };for (auto ch: s){count[ch - 'a']++;//统计各字符出现的次数,'a'- 'a' = 0,'b'- 'a'= 1,'c'- 'a'= 2...将字母映射到下标}for (int i = 0; i < s.size(); i++){if (count[s[i] - 'a'] == 1)//检查每个字符出现的次数是否为1,是则返回下标{return i;}}return -1;}
};

test3:最后一个单词的长度

描述

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

输入描述:

输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:

输出一个整数,表示输入字符串最后一个单词的长度。

#include<iostream>
#include<string>
using namespace std;int lastwordcounts(string& s)
{string::reverse_iterator rit = s.rbegin();int count = 0;while (rit != s.rend())//遍历字符串{if (*rit == ' ')//遇到空格结束{break;}count++;rit++;}return count;
}int main()
{string s;getline(cin,s);//不能使用cin进行输入,cin遇到‘ ’停止读取cout << lastwordcounts(s) << endl;return 0;
}

test4:验证一个字符串是否是回文

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

bool isPalindrome(string s)
{//保留字母,并将大写字母转换为小写string temp;for (auto ch : s){if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9')){if ('A' <= ch && ch <= 'Z'){ch += 32;}temp += ch;}}int left = 0, right = temp.size() - 1;int flag = 1;while (left < right){if(temp[left] == temp[right]){left++;right--;}else{return false;}}return true;
}

test5:字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

  • 1 <= num1.length, num2.length <= 104
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零
#include<iostream>
#include<string>
using namespace std;class Solution {
public:string addStrings(string num1, string num2) {string s;int end1 = num1.size() - 1;//最后一个有效字符的位置int end2 = num2.size() - 1;int next = 0;//进位int n = 0;//有效数字while (end1 >= 0 || end2 >= 0)//从最后一个有效字符的位置遍历字符串,直到两个字符串都结束{//0 1 1// 1 2 3int n1 = end1 >= 0 ? num1[end1] - '0' : 0;//分为该位置有无字符,如果有字符将其分别转化为数字存储在n1,和n2中,如果没有就把0存储在n1或n2中参与计算int n2 = end2 >= 0 ? num2[end2] - '0' : 0;n = (n1 + n2 + next) % 10;//(n1+n2+进位)取余 为有效数字 next = (n1 + n2 + next) / 10; //进位s.insert(s.begin(), n + '0'); //将有效数字存储转化为字符存储在string中end1--;end2--;}if (next == 1)//还存在进位{s.insert(s.begin(), '1');}return s;}
};int main()
{Solution sl;string s1("11");string s2("123");string s = sl.addStrings(s1, s2);cout << s;return 0;
}

test6: 翻转字符串2:翻转字符串中的单词

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
#include<iostream>
#include<string>
#include<stdbool.h>
using namespace std;int min(int a, int b)
{if (a > b){return b;}return a;
}string reverseStr(string s, int k)
{for (int i = 0; i < s.size(); i += (k * 2)){reverse(s.begin() + i, s.begin() + min(i + k, s.size()));//翻转每个下标从2k的倍数开始的,长度为k的子串,如果该子串长度不足k,则翻转整个子串}return s;
}int main()
{string s("abcdefg");int k = 2;cout << reverseStr(s, k) <<endl;return 0;
}

test7: 翻转字符串3:翻转字符串中的单词

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

class Solution {
public:string reverseWords(string s){int begin = 0;int end;for (int i = 0; i < s.size(); i++)//遍历s{if (s[i] == ' ')//找到空格{end = i;reverse(s.begin() + begin, s.begin() + end);//翻转单词begin = end + 1;}}reverse(s.begin() + begin, s.end());//最后一个单词找不到空格,单独处理return s;}
};

test8: 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

class Solution {
public:string addStrings(string num1, string num2) {string s;int end1 = num1.size() - 1;//最后一个有效字符的位置int end2 = num2.size() - 1;int next = 0;//进位int n = 0;//有效数字while (end1 >= 0 || end2 >= 0)//从最后一个有效字符的位置遍历字符串,直到两个字符串都结束{//0 1 1// 1 2 3int n1 = end1 >= 0 ? num1[end1] - '0' : 0;//分为该位置有无字符,如果有字符将其分别转化为数字存储在n1,和n2中,如果没有就把0存储在n1或n2中参与计算int n2 = end2 >= 0 ? num2[end2] - '0' : 0;n = (n1 + n2 + next) % 10;//(n1+n2+进位)取余 为有效数字 next = (n1 + n2 + next) / 10; //进位s.insert(s.begin(), n + '0'); //将有效数字存储转化为字符存储在string中end1--;end2--;}if (next == 1)//还存在进位{s.insert(s.begin(), '1');}return s;}string multiply(string num1, string num2) {//1 2 3 4        n-1      n-1      n-1//                i      i      i//1 2 3 4   1 2 3 4  1 2 3 4  1 2 3 4  //  5 6 7         7      6      5 //                         0      0 0          string ans;if (num1 == "0" || num2 == "0"){ans += "0";return ans;}int m = num1.size(), n = num2.size();int add = 0;//进位string curr;for (int i = n - 1; i >= 0; i--)//遍历mu2{curr.clear();for (int j = n - 1; j > i; j--)//将(i,n-1]之间补上字符0{curr += "0";}int y = num2[i] - '0';//将num2[i]变为数字0for (int j = m - 1; j >= 0; j--)//将num2的每个数字分别与num1相乘{int x = num1[j] - '0';int z = x * y + add;curr.push_back(z % 10 + '0');//(x+y+进位)取余 为有效数字 add = z / 10;//进位}if (add != 0)//还存在进位{curr.push_back(add % 10 + '0');add = add / 10;}reverse(curr.begin(), curr.end());//逆转每一次相乘结果ans = addStrings(ans, curr);//与最终结果相加}return ans;}
};


http://www.ppmy.cn/embedded/141350.html

相关文章

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s &#xff08;bus&#xff09; lspci -s 03:00.0通过vendor id或者device id等设备查看 -d &#xff08;device&#xff09; lspci -d 15b3: #这里是vendor号&#xff0c;所以在前面 lspci -d :1021 #这里是设备号&#xff0c;所以要:在前vendorid和deviceid…

Postman定义公共函数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[…

视频 wmv 转MP4

ffmpeg -i input.wmv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4命令说明 -i input.wmv&#xff1a; 指定输入文件 input.wmv。 -c:v libx264&#xff1a; 使用 H.264 视频编码&#xff0c;适用于 MP4 格式。 -crf 23&#xff1a; 设置视频质量&#…

uniapp生命周期:应用生命周期和页面生命周期

文章目录 1.应用的生命周期2.页面的生命周期 1.应用的生命周期 生命周期的概念&#xff1a;一个对象从创建、运行、销毁的整个过程被称为生命周期 生命周期函数&#xff1a;在生命周期中每个阶段会伴随着每一个函数的出发&#xff0c;这些函数被称为生命周期函数 所有页面都…

微积分复习笔记 Calculus Volume 1 - 6.8 Exponential Growth and Decay

6.8 Exponential Growth and Decay - Calculus Volume 1 | OpenStax

栈和队列——考研笔记

文章目录 一.栈&#xff08;Stack&#xff09;基本概念1.栈的基本操作2.栈的常考题型 二.顺序栈的实现1.顺序栈的定义2.增&#xff08;进栈操作&#xff09;3.删&#xff08;出栈操作&#xff09;4.共享栈&#xff08;两个栈共享同一片空间&#xff09; 三.链栈的实现1.头插法建…

【linux】tar命令讲解笔记

Linux tar 命令 Linux tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。 tar 名字来自 "tape archive"&#xff08;磁带归档&#xff09;&#xff0c;最初用于将…

NLP论文速读(EMNLP2024)|多风格可控生成的动态多奖励权重

论文速读|Dynamic Multi-Reward Weighting for Multi-Style Controllable Generation 论文信息&#xff1a; 简介&#xff1a; 本文探讨了文本风格在沟通中的重要性&#xff0c;指出文本风格传达了除原始语义内容之外的多种信息&#xff0c;如人际关系动态&#xff08;例如正式…