String类的相关OJ题目的理解

在这里插入图片描述

目录:

一.找出字符串中第一个只出现一次的字符

框架:

1.先定义一个字符串
2.每个字符进行输入的时候进行+1操作
3.在将最终只出现一次的字符进行输出

int main(){

	string s;		//定义字符串
	while (cin >> s){		//循环输入

		int idx[126] = { 0 };		//给定对应的数组
		for (int i = 0; i<s.size(); i++){	//在整个字符串中进行循环遍历

			idx[int(s[i])] += 1;		//如果对应的字符出现多次则进行++操作
		}
		for (int i = 0; i<s.length(); i++){	//再次进行循环遍历

			if (idx[int(s[i])] == 1){		//找到只出现一次的字符

				cout << s[i] << endl;		//将其进行输出
				break;						//循环结束
			}
			else if (i == s.size() - 1)		//没找到则对其进行-1操作
				cout << "-1" << endl;		//然后输出-1,说明未找到
		}
	}
	return 0;
}

二.两个字符串进行相乘

框架:

1.所有的底层都是按照二进制的形式进行存储的,在这里全部转成二进制就可以了

class Solution {
public:
	string multiply(string num1, string num2) {		//定义对应的两个字符串
	
		int l1 = num1.size();	
		int l2 = num2.size();		//求出对应的size()长度
	
		string res(l1 + l2, '0');		//定义一个新的字符串用于接收其中的数据
		
		for (int i = l1 - 1; i >= 0; i--) {
			for (int j = l2 - 1; j >= 0; j--) {		//两重循环进行--遍历操作
				int tmp = (res[i + j + 1] - '0') + (num1[i] - '0')*(num2[j] - '0');    
				res[i + j + 1] = tmp % 10 + '0';		//对其中的每个数进行取模转成二进制操作
				res[i + j] += tmp / 10;
			}
		}
		for (int i = 0; i < l1 + l2; i++){		//在对应的数据比对完后,在将其从新创建的字符串res进行输出
			if (res[i] != '0') return res.substr(i);
		}
		return "0";
	}
};

三.翻转字符串中的单词

框架:

1.利用字符串中的迭代器进行操作

class Solution {
public:
	string reverseWords(string s) {		//字符串对象s
		int n = s.size();				//求出其中的size
		int begin = 0, end;				//给出对应的迭代器对应的位置
		for (int i = 0; i<n + 1; i++){		//循环

			if (s[i] == ' ' || s[i] == '\0'){		//如果字符不为空格或者是最后的时候

				for (end = i - 1; begin<end; begin++, end--){	//继续利用迭代器进行循环操作

					swap(s[begin], s[end]);	//将begin()和end()迭代器的字符进行交换,在迭代器进行++--的时候进行操作
				}
				begin = i + 1;
			}
		}
		return s;		//最后将翻转后的单词进行输出
	}
};

四.翻转字符串的部分区间

框架:

1.学会利用迭代器

class Solution {
public:
	string reverseStr(string s, int k) {		//对应的string对象和要翻转的区间
		for (int i = 0; i < s.size(); i += (2 * k)) {	//在给定的区间中进行循环

			if (i + k <= s.size()) {		//如果没有将对应的区间循环完整,则递归进行调用
				reverse(s.begin() + i, s.begin() + i + k);	//递归调用
				continue;
			}
			reverse(s.begin() + i, s.begin() + s.size());	//递归调用,注意对应的区间是不同的
		}
		return s;		//返回对应的string对象
	}
};

五.验证字符串是否回文

框架:

1.一个字符串的正序和逆序的序列一致则被证明是回文字符串
2.我们只要利用迭代器进行正序和逆序的比对就可以实现其中的操作

class Solution {
public:
	bool isPalindrome(string s) {
		int l = 0, r = s.size() - 1;	//定义对应的起始位置和字符串的长度
		while (l<r)		//在对应的长度内部进行循环
		{
			while (l < s.size() && !isalnum(s[l])) ++l;	//在size内部对对应的l进行++操作
			while (r >= 0 && !isalnum(s[r])) --r;		//对对应的r进行--操作,这里改变的是字符串对应的下标位置,通过改变下标来改变其中的字符位置
			if (l<r && tolower(s[l++]) != tolower(s[r--])) return false;	//进行循环的比对,不同则返回false
		}
		return true;	//相同返回true
	}
};

六.字符串最后一个单词的长度

框架:

1.通过循环找到对吼一个单词之前的空格和单词后面的\0来找到要求的位置
2.查找到对应的长度

int main(){

	string str;		//创建对应的字符串对象
	getline(cin, str);		//在碰到\n的时候输入结束
	int count = 0;			//定义对应的count值
	int len = str.length();	//求出字符串的长度

	for (int i = (len - 1); i >= 0; i--){	//在循环内部

		if (str[i] != ' '){	//碰到空格的时候进行++计数操作

			count++;
		}
		else{
			break;		//没有找到则退出循环
		}
	}
	cout << count << endl;	//将对应的count值进行输出
	return 0;
}

七.找出字符串中只出现一次的字符

class Solution {
public:
	int firstUniqChar(string s) {
		for (int i = 0; i < s.size(); i++){	//在字符串内部进行循环

			if (s.find(s[i]) == s.rfind(s[i])){	//利用find()和rfind()函数进行循环
				return i;		//找到则输出对应的位置
			}
		}
		return -1;		//没找到则返回-1
	}
};

八.翻转字符串

框架:

1.利用vector容器对其进行翻转

class Solution {
public:
	void reverseString(vector<char>& s) {	//初始化其中对应的char类型的容器
		int n = s.size();	//求出其中的长度
		//定义循环的初始和结束的位置,依次向中间位置进行移动
		for (int left = 0, right = n - 1; left < right; ++left, --right) {
			swap(s[left], s[right]);//将对应位置的字符进行前后交换
		}
	}
};

九.字符串相加

class Solution {
public:
	string addStrings(string num1, string num2) {	//定义对应的两个字符串
		int i = num1.size() - 1, j = num2.size() - 1;	//求出对应字符串的长度
		string ans;		//定义新的字符串对象
		int carry = 0;	//整型定义
		while (i >= 0 || j >= 0 || carry != 0) {
			int n1 = i >= 0 ? num1[i--] - '0' : 0;
			int n2 = j >= 0 ? num2[j--] - '0' : 0; //对两个字符串进行--操作
			int sum = n1 + n2 + carry;		//定义出ans的长度
			ans += (sum % 10 + '0');	//将其中的字符挨个赋予到ans中
			carry = sum / 10;			//依次/10
		}
		reverse(ans.begin(), ans.end());	//利用迭代器翻转全部的字符
		return ans;		//输出新的创建的字符串
	}
};

十.字符串转成整型数字

class Solution {
public:
	int StrToInt(string str) {		//定义字符串对象
		if (str.empty())			//判空操作
			return 0;
		int an = 0, f = 0;
		for (int i = 0; i<str.size(); ++i){		//全部字符串中进行循环

			if (str[i] == '-'){		//遇到-时返回0
				if (i != 0){
					return 0;
				}
				f = 1;	//让f=1
			}
			else if (str[i] == '+'){	//遇到+时

				if (i != 0){
					return 0;		//不等于则返回0
				}
			}
			else if (str[i] >= '0'&&str[i] <= '9'){		//当在字符0到9之间的时候
				an = an * 10 + str[i] - '0';	//对其进行整数变换操作
			}
			else{
				return 0;		//否则返回0
			}
		}
		return an*pow(-1, f);	//将对应的值乘pow(-1,f),并将其中的值进行返回
	}
};

这篇博客是对于字符串相关的OJ题目的理解,当然解题方式不是唯一的,希望给大家带来帮助.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值