一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
1、仅仅反转字母<难度系数⭐>
📝 题述:给你一个字符串 s ,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母 (小写或大写) 位置反转。
返回反转后的 s 。
💨示例1:
输入:s = "ab-cd" 输出:"dc-ba"
💨示例2:
输入:s = "a-bC-dEf-ghIj" 输出:s = "a-bC-dEf-ghIj"
💨示例3:
输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"
⚠ 提示
- 1 <= s.length <= 100
- s 仅由 ASCII 值在范围 [33, 122] 的字符组成
- s 不含 '"' 或 '\'
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
- 这里利用快排的思想 —— 下标完成
- 逻辑不变 —— 将下标改造成迭代器
1、
class Solution
{
public:
bool isLetter(char ch)//判断是否为字母,如果是返回treu,否则返回false
{
if(ch >= 'a' && ch <= 'z')
return true;
if(ch >= 'A' && ch <= 'Z')
return true;
return false;
}
string reverseOnlyLetters(string s)
{
int begin = 0;
int end = s.size() - 1;
while(begin < end)
{
while(begin < end && !isLetter(s[begin]))//非英文字母,且保证最后begin和end重合
{
++begin;
}
while(begin < end && !isLetter(s[end]))//非英文字母,且保证最后begin和end重合
{
--end;
}
swap(s[begin], s[end]);//交换
//交换后还要调整
++begin;
--end;
}
return s;
}
};
2、
class Solution
{
public:
bool isLetter(char ch)//判断是否为字母,如果是返回treu,否则返回false
{
if(ch >= 'a' && ch <= 'z')
return true;
if(ch >= 'A' && ch <= 'Z')
return true;
return false;
}
string reverseOnlyLetters(string s)
{
auto begin = s.begin();
auto end = s.end() - 1;
while(begin < end)
{
while(begin < end && !isLetter(*begin))//非英文字母,且保证最后begin和end重合
{
++begin;
}
while(begin < end && !isLetter(*end))//非英文字母,且保证最后begin和end重合
{
--end;
}
swap(*begin, *end);//交换
//交换后还要调整
++begin;
--end;
}
return s;
}
};
2、字符串中第一个唯一字符<难度系数⭐>
📝 题述:给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
💨示例1:
输入:s = "leetcode" 输出:0
💨示例2:
输入: s = "loveleetcode" 输出: 2
💨示例3:
输入: s = "aabb" 输出: -1
⚠ 提示
- 1 <= s.length <= 10^5^
- s 只包含小写字母
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:如果一个字符一个字符的去比较,效率很慢,最坏的情况是 O(N^2^),所以我们这里建立一个映射关系去统计次数,原理同计数排序
class Solution
{
public:
int firstUniqChar(string s)
{
int count[26] = {0};
//统计每个字符出现的次数
for(auto ch:s)
{
count[ch - 'a']++;
}
//找出字符串中第一个不重复的字符
for(int i = 0; i < s.size(); ++i)
{
if(count[s[i] - 'a'] == 1)
{
return i;
}
}
return -1;
}
};