1. 字符串相加
class Solution{
public:
string addStrings(string num1, string num2){
int end1 = num1.size()-1,end2 = num2.size()-1;
int next = 0;
string strRet;
while(end1 >= 0 || end2 >= 0)
{
int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
int ret = val1 + val2 + next;
next = ret > 9 ? 1 : 0;
//尾插
strRet += ('0' + ret%10);
--end1;
--end2;
}
if(next == 1)
strRet += '1';
//逆置
reverse(strRet.begin(),strRet.end());
return strRet;
}
};
2. 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
size_t begin = 0, end = s.size()-1;
while(begin < end)
{
swap(s[begin],s[end]);
++begin;
--end;
}
}
};
3. 仅仅反转字母
class Solution{
public:
bool IsLetter(char ch)
{
if((ch >= 'a' && ch <= 'z')
|| (ch >= 'A' && ch <= 'Z'))
return true;
else
return false;
}
string reverseOnlyLetters(string 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;
}
};
4. 变型题:验证回文串
class Solution {
public:
bool isLetterOrNumber(char ch)
{
return (ch >= '0' && ch <= '9')
|| (ch >= 'a' && ch <= 'z');
//小写字母以及数字
}
bool isPalindrome(string s) {
//统一大小写字母,这里选择将大写字母转为小写
for(auto& ch : s)//范围for遍历,要改内容用引用&
{
if(ch >= 'A' && ch <= 'Z')
ch += 32;//ascll
}
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])
{
++begin;
--end;
}
else
{
return false;
}
}
return true;
}
};
5. 字符串最后一个单词的长度
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
//cin>>str
//输入多个值之间是用空格或换行间隔
//空格后的字符串依旧在缓冲区,只能取空格之前的字符串长度,不符合题意
getline(cin,str);
size_t pos = str.rfind(' ');//找空格
if(pos != string::npos)//有空格的情况
{
cout<<str.size()-pos-1<<endl;
}
else//没有空格的情况
{
cout<<str.size()<<endl;
}
}
6. 字符串中的第一个唯一字符
- 暴力查找
- 技术排序(哈希)
class Solution {
public:
int firstUniqChar(string s) {
int countArr[26] = {0};
for(auto ch : s)
{
countArr[ch-'a']++;
}
for(size_t i = 0; i < s.size(); ++i)//循环保证之出现一次
{
if(countArr[s[i]-'a'] == 1)
return i;
}
return -1;
}
};