当前位置: 首页 > news >正文

string练习题

1.仅仅反转字母

反转字母题目链接

我们使用 left 指针从左边开始扫描字符串 s,right 指针从右边开始扫描字符串 s。如果两个指针都扫描到字母,且 left<right,那么交换 s[left] 和 s[right],然后继续进行扫描;否则表明反转过程结束,返回处理后的字符串。

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.字符串里面最后一个单词的长度
 

字符最后一个单词长度

使用cin直接读入字符串会在遇到第一个空格时就停止,导致读入出错。使用getline()方法读入整行内容。再从后往前遍历,遇到第一个空格就停止,此时遍历了最后一个单词,输出对应的遍历的次数即可。 

#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;
}

3.验证一个字符串是否是回文

验证回文串

最简单的方法是对字符串 s 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood 中。这样我们只需要判断 sgood 是否是一个普通的回文串即可。

判断的方法有两种。第一种是使用语言中的字符串翻转 API 得到 sgood 的逆序字符串 sgood_rev,只要这两个字符串相同,那么 sgood 就是回文串。

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)
		{
			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;
	}
};

 4.字符串相加

字符串相加

本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。

class Solution {
public:
	string addStrings(string num1, string num2) {
		int n1 = num1.size() - 1;
		int n2 = num2.size() - 1;
		int next = 0;
		string str = "";

		while (n1 >= 0 || n2 >= 0)
		{
			int x1 = n1 >= 0 ? num1[n1--] - '0' : 0;
			int x2 = n2 >= 0 ? num2[n2--] - '0' : 0;
			int x = x1 + x2 + next;

			//进位
			next = x / 10;
			//取值
			x = x % 10;
			str += (x + '0');
		}
		if (next == 1)
		{
			str += (1 + '0');
		}
		reverse(str.begin(), str.end());
		return str;
	}
};

5.加餐练习

课后作业练习——翻转字符串II 

课后作业练习——翻转字符串III

 课后作业练习——字符串相乘

 课后作业练习——找出字符串中第一个只出现一次的字符

相关文章:

  • 并发编程面试题三
  • MCP技术将重塑 SaaS 与 AI 的协作范式
  • 【操作系统】进程间通信方式
  • Boost C++ `split()` 全面解析:高效字符串拆分与优化实践
  • Spring Boot 3 新特性实战:从理论到实践
  • 15-双链表-双链表基本操作
  • 毕业论文答辩自述模板(本科、硕博均可使用)
  • Claude:从安全优先的 AI 实验室到创作者协作者(2025 深度解析)
  • BoNBoN——结合行为模仿和偏好对齐进行Best-of-N对齐的方法
  • 【Linux】深入理解Linux进程状态与优先级管理
  • 重删算法中的Bloom滤波器详解与C++实现
  • 1.5.6 掌握Scala内建控制结构 - match结构
  • NVIDIA开源FP8训练新范式COAT:减少40%显存占用,训练速度提高1.4倍
  • Linux目录操作学习总结
  • AI辅助的黑客攻击
  • docker最新源,及遇到问题+处理
  • 利用Python爬虫获取Shopee(虾皮)商品详情:实战指南
  • 【Linux】VMware 17 安装 VMware Tools
  • HAl库开发中断方式接收Can报文的详细流程
  • 深入自制Shell:解锁Linux进程控制的实践密码
  • 网站制作服务公司/g3云推广靠谱吗
  • 做市场浏览什么网站/济南百度快照推广公司
  • 潍坊网站制作在线/做推广app赚钱的项目
  • 南坪做网站/淘宝指数在线查询
  • 创业网站开发/站长之家seo工具包
  • php动态网站开发课后/seo批量建站