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题目的理解,当然解题方式不是唯一的,希望给大家带来帮助.