class Solution {
public:
int StrToInt(string str) {
int flag=1;
long long ret=0;
string::iterator it=str.begin();
// 处理空字符串的情况
if (it == str.end())
{
return 0;
}
// 处理符号
if (*it == '-')
{
flag = -1;
++it;
} else if (*it == '+')
{
++it;
}
// 遍历字符串,将每个字符转换为数字并累加到结果中
while (it != str.end()) {
if (*it >= '0' && *it <= '9')
{
ret = ret * 10 + (*it - '0');
++it;
} else
{
return 0;
}
}
// 根据符号返回最终结果
return flag * ret;
}
};
首先处理空字符串为空的情况()
再处理第一个字符可能为+
-
的情况,直接定一个flag
初始化为1,遇到-
就赋值为-1
接下来就利用迭代器进行循环,如果是字符数字就直接使用
ret = ret * 10 + (*it - '0');
是其他字符,直接return 0;了
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
}
};
大家学习了c++,可能直接就想到了。但是我们刷题还是尽量会本质
class Solution {
public:
void reverseString(vector<char>& s) {
//reverse(s.begin(),s.end());
int left=0;
int right=s.size()-1;
while(left<right)
{
swap(s[left],s[right]);
left++;
right--;
}
}
};
还是老朋友啦:使用双指针法,进行交换,直到相遇
class Solution {
public:
int firstUniqChar(string s) {
int arr[26]={0};
int index=0;
char singal='0';
//不会出现空字符
for(auto e:s)
{
arr[e-'a']++;
}
//再次遍历string,而不是arr
for(int i=0;i<s.size();i++)
{
if(arr[s[i]-'a']==1)
{
return i;
}
}
return -1;
}
};
利用计数排序的思想,利用一个数组
- 我们看到,这个字符串只会出现小写字母,我们就定义一个整型数组
arr[26]
:0处是a,1处是b…,25处是z- 先把string给遍历一遍,这里是使用了范围for:哪个字母出现一此,就使用
arr[e-'a']++;
来进行自增,现在出现一次的字母对应在数组里的值是1,两次是2- 有时有多个出现一次的字母,我们需要返回的是第一个
所以还是从string开始遍历,为了返回第一个(我一开始因为从arr开始遍历,一直不能通过)
class Solution {
public:
bool isLetter(char ar)
{
if((ar>='A'&&ar<='Z')||(ar>='a'&&ar<='z'))
{
return true;
}
return false;
}
string reverseOnlyLetters(string s) {
//仿照快排一次的思想
int left=0;
int right=s.size()-1;
while(left<right)
{
//右侧先行
while(left<right&&!isLetter(s[right]))//找字母才停
{
right--;
}
while(left<right&&!isLetter(s[left]))//找字母
{
left++;
}
swap(s[left],s[right]);
right--;
left++;
}
return s;
}
};
使用双指针的方法,类似于快速排序中的一次划分。
- 具体来说,维护了两个指针(下标) left 和 right,它们分别指向字符串的开头和结尾。
- 然后,你使用 while 循环来不断移动这两个指针,并在遇到字母时进行交换。当 left 指向的字符不是字母时,left 指针向右移动;当 right 指向的字符不是字母时,right 指针向左移动。
- 一旦找到了两个位置上的字母,就交换它们的位置。最终,当 left 和 right 指针相遇时,整个字符串就完成了反转
今天就到这里啦!