👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
目录
- 一、把字符串转化为整数
- 二、字符串相加
- 三、反转字符串
- 四、字符串中的第一个唯一字符
- 五、字符串最后一个单词的长度
- 六、验证回文串
- 七、反转字符串 II
- 八、 反转字符串中的单词 III
- 九、高精度乘以高精度
一、把字符串转化为整数
题目链接:点击跳转
class Solution {
public:
int StrToInt(string str)
{
// 特判集合可能为空集的情况
if (str.empty()) return 0;
int flag = 1; // 用来判断这个数是正数还是负数
int i = 0; // 遍历字符串
if (str[i] == '-')
{
flag = -1;
i++;
}
else if (str[i] == '+')
{
i++;
}
int ans = 0; // 存储数字
for (; i < str.size(); i++)
{
if (str[i] < '0' || str[i] > '9')
{
return 0;
}
ans = ans * 10 + (str[i] - '0');
}
return ans * flag;
}
};
二、字符串相加
题目链接:点击跳转
class Solution {
public:
// 解决思路:模拟
string addStrings(string num1, string num2) {
// 将字符串翻转(原因:进位头插很头疼)
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
string ans; // 答案
int t = 0; // 进位
for (int i = 0; i < num1.size() || i < num2.size() || t; i++)
{
if (i < num1.size()) t += num1[i] - '0';
if (i < num2.size()) t += num2[i] - '0';
ans.push_back(t % 10 + '0');
t /= 10;
}
// 最后将答案翻转
reverse(ans.begin(), ans.end());
return ans;
}
};
三、反转字符串
题目链接:点击跳转
class Solution {
public:
// 解决思路:双指针算法
void reverseString(vector<char>& s)
{
vector<char>::iterator left = s.begin();
vector<char>::iterator right = s.end() - 1;
while (left < right)
{
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
for (auto& e : s)
{
cout << e;
}
}
};
四、字符串中的第一个唯一字符
题目链接:点击跳转
- 解题思路1:哈希表
class Solution {
public:
int firstUniqChar(string s)
{
unordered_map<char, int> heap;
for (int i = 0; i < s.size(); i++)
{
heap[s[i]]++;
}
for (int i = 0; i < s.size(); i++)
{
if (heap[s[i]] == 1)
{
return i;
}
}
return -1;
}
};
- 解题思路2:用数组模拟哈希表
class Solution {
public:
int firstUniqChar(string s)
{
int heap[26] = {0};
for (int i = 0; i < s.size(); i++)
{
heap[s[i] - 'a']++;
}
for (int i = 0; i < s.size(); i++)
{
if (heap[s[i] - 'a'] == 1)
{
return i;
}
}
return -1;
}
};
五、字符串最后一个单词的长度
题目链接:点击跳转
- 解题思路1:从最后一个字符开始遍历,直到遇到空格停止
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin, s);
int ans = 0;
for (int i = s.size() - 1; i >= 0; i--)
{
if (s[i] != ' ') ++ans;
else break;
}
cout << ans << endl;
return 0;
}
- 解题思路2:巧用函数(不推荐,因为函数根本记不住hh)
#include <iostream>
using namespace std;
int main()
{
string s;
getline(cin, s);
// rfind:从后往前查找目标
int space_of_lastpos = s.rfind(' ');
int last_pos = s.size() - 1;
int res = last_pos - space_of_lastpos;
cout << res << endl;
return 0;
}
六、验证回文串
题目链接:点击跳转
class Solution {
public:
bool isPalindrome(string s) {
// 将大写字符转换为小写字符
string str;
for (auto& e : s)
{
if (e >= 'A' && e <= 'Z')
{
str += tolower(e);
}
// 移除所有非字母数字字符之后
// 意思是保留字母 + 数字
else if ((e >= 'a' && e <= 'z') || (e >= '0' && e <= '9'))
{
str += e;
}
}
// 判断回文串
if (str.empty()) return true; // 特殊情况
string str2(str);
reverse(str2.begin(), str2.end());
if (str == str2) return true;
else return false;
}
};
七、反转字符串 II
题目链接:点击跳转
class Solution {
public:
// 思路:将题目描述转化为代码即可
string reverseStr(string s, int k)
{
// 间隔2k
for (int i = 0; i < s.size(); i += (2 * k))
{
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (s.size() - i >= k)
{
reverse(s.begin() + i, s.begin() + i + k );
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
else
{
reverse(s.begin() + i, s.begin() + s.size());
}
}
return s;
}
};
八、 反转字符串中的单词 III
题目链接:点击跳转
class Solution {
public:
// 解题思路:双指针算法
string reverseWords(string s)
{
for (int i = 0; i < s.size(); i++)
{
int j = i;
while (j < s.size() && s[j] != ' ') j++;
if (s[j] == '\0')
{
reverse(s.begin() + i, s.begin() + s.size());
break;
}
reverse(s.begin() + i, s.begin() + j);
i = j;
}
return s;
}
};
九、高精度乘以高精度
题目链接:点击跳转
class Solution {
public:
string multiply(string num1, string num2)
{
vector<int> A,B;
// 到存
int n = num1.size(), m = num2.size();
for (int i = n - 1;i >= 0; i--)
A.push_back(num1[i] - '0');
for (int i = m - 1;i >= 0;i--)
B.push_back(num2[i] - '0');
vector<int> c(n + m);
for(int i = 0;i < A.size();i++)
{
for(int j = 0;j < B.size();j++)
{
c[i + j] += A[i] * B[j];
// 处理进位
if (c[i + j] >= 10)
{
c[i + j + 1] += c[i + j] / 10;
}
c[i + j] %= 10;
}
}
while(c.size() > 1 && c.back() == 0)
c.pop_back();
reverse(c.begin(), c.end());
string ans;
for (size_t i = 0; i < c.size(); i++)
{
ans += c[i] + '0';
}
return ans;
}
};