前言
这里的题目大多是用c++写的。
题目
- 字符串中的第一个唯一字符
- 翻转字符串
- 验证回文串
- 把字符串转换成整数
字符串中的第一个唯一字符
原题链接:字符串中的第一个唯一字符
计数法:
class Solution {
public:
int firstUniqChar(string s) {
int arr[130] = {0};
for(auto x : s)
{
arr[x-'0']++;
}
int i = 0;
for(auto x : s)
{
if(arr[x-'0'] == 1)
return i;
i++;
}
return -1;
}
};
翻转字符串
原题链接: 翻转字符串
版本一:
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0,right = s.size() -1;
while(left<right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
// swap(s[left],s[right]);这边交换可以直接用c++给的swap
left++;
right--;
}
}
};
这里不能用指针
版本二:
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
验证回文串
原题链接:验证回文串
自己做的:
class Solution {
public:
bool isPalindrome(string s) {
string s1(s.size(),'\0');
string::iterator it = s.begin();
int i = 0;
while (it != s.end())
{
if (isalnum(*it))
{
s1[i++] = *it;
}
it++;
}
transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
int sz = 0;
while (s1[sz] != '\0')
{
sz++;
}
string s2(s1,0,sz);
s1 = s2;
reverse(s2.begin(), s2.end());
if (s1.compare(s2) == 0)
return true;
else
return false;
}
};
做这道题,让我深刻意识到以下几点:
- string类的字符串,如果要判断是否相同,它们的’\0’也要算进去
- string类的字符串,它们的size包括’\0’
官方版本:
🚗方法一:筛选 + 判断
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);//可以用运算符重载+=
}
}
string sgood_rev(sgood.rbegin(), sgood.rend());//直接用rbegin反转
return sgood == sgood_rev;//运算符重载==判断是否相等
}
};
🚗方法二:双指针
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};
🚗方法三:在原字符串上直接判断
我们直接在原字符串 sss 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
int left = 0, right = n - 1;
while (left < right) {
while (left < right && !isalnum(s[left])) {
++left;
}
while (left < right && !isalnum(s[right])) {
--right;
}
if (left < right) {
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
把字符串转换成整数
原题链接:把字符串转换成整数
my version:
class Solution {
public:
bool IsLegal(string str)
{
for(auto ch : str)
{
if((ch>'9'||ch<'0'))
return false;
}
return true;
}
int StrToInt(string str) {
if(str.size() == 0)
return 0;
if(((str[0]!='+'&&str[0]!='-')&&(str[0]>'9'||str[0]<'0')))
return 0;
string s1(str,1);
if(IsLegal(s1) == false )
return 0;
int lenth = str.size();
if(str[0]=='+'||str[0]=='-')
lenth--;
int sum = 0;
string s2 = (str[0]<='9'&&str[0]>='0') ? str:s1;
for(auto ch : s2)
{
int x = ch - '0';
sum+=x*pow(10,lenth - 1);
lenth--;
}
if(str[0]=='-')
sum = -sum;
return sum;
}
};
other version:
class Solution {
public:
int StrToInt(string str) {
int ans = 0;int isplus = 1;
for(char ch:str){
if(isalpha(ch))
{
return 0;
}if (ch == '+' || ch =='-')
{
isplus = (ch == '+') ? 1 : -1;
}
if(isdigit(ch))
{
ans = ans*10+ch-'0';
}
}return isplus*ans;
}
};
这个版本厉害!