Impossible=I’m possible
只要你努力了,就没什么是不可能的!
1.仅仅反转字母
代码如下:
class Solution {
public:
bool isletter(char ch)
{
if (ch >= 'a' && ch <= 'z')
return true;
if (ch >= 'A' && ch <= 'Z')
return true;
return false; //不是则错误
}
string reverseOnlyLetters(string s) {
if (s.empty())
{
return s;
}
size_t begin = 0;
size_t 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; //最后返回s
}
};
2.找字符串中第一个只出现依次的字符
代码如下:
//这里用到find和rfind函数, s.find(s[i]) : 返回字符串s中从左向右查找s[i]第一次出现的位置;
// s.rfind(s[i]) : 返回字符串s中从右向左查找s[i]第一次出现的位置;
class olution {
public:
int firstUniqChar(string s)
{
for (int i = 0; i < s.size(); i++)
{
if (s.find(s[i]) == s.rfind(s[i]))
{
return i;
}
}
return -1;
}
};
3.字符串里面最后一个单词的长度
代码如下:
#include <iostream>
using namespace std;
int main() {
string str;
getline(cin, str);//获取字符串
//找最后一个空格,利用rfind函数
size_t pos = str.rfind(' ');
cout << str.size() - pos - 1 << endl;
}
4.验证一个字符串是否是回文
代码如下:
class Solution {
public:
bool isLetterOrNumber(char ch) //判断数字,大小字母
{
return (ch >= '0' && ch <= '9') || (ch >= 'A') && ch <= 'Z')
|| (ch >= 'a') && (ch <= 'z')
}
bool isPalindrome(string s) {
//遍历,先将小写转换为大写
for (auto& ch : s)
{
if (ch >= 'a' || ch <= 'z')
{
ch -= 32;
}
}
int begin = 0;
int 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]])
{
return false;
}
else
{
++begin;
--end;
}
return true;
}
};
或者
class Solution {
public:
bool isPalindrome(string s) {
// 双指针
if(s.size() <= 1) return true;
int i = 0, j = s.size() - 1;
while(i < j){
while(i < j && !isalnum(s[i])) // 排除所有非字母或数字的字符
i++;
while(i < j && !isalnum(s[j]))
j--;
if(tolower(s[i++]) != tolower(s[j--])) //统一转换成小写字母再比较
return false;
}
return true;
}
};
5.字符串相加
代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
//从后往前加,相加的结果到字符串可以使用insert头插
//或者+=尾插以后在reverse过来
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
//扩容+1可能有进位
int carry = 0; //进位
string retStr; //存储结果
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 + carry;
carry = ret / 10;
ret %= 10; //余数
//retstr.insert(0,1,'0'+ret); //头插,在0的位置插入一个长度1的字符
retStr += ('0' + ret);
--end1;
--end2;
}
if (carry == 1)
{
retStr += '1';
}
reverse(retStr.begin(), retStr.end()); //翻转
return retStr;
}
};
1121

被折叠的 条评论
为什么被折叠?



