题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/sort-letters-by-case/
题目:
给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出"abAcD",一个可能的答案为"acbAD"
注意
小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置。
挑战
在原地扫描一遍完成
难度级别:
中等
中等
思路分析:
首先,我们需要注意的是,此题并未要求对字符进行排序,且小写字母或者大写字母他们之间不一定要保持原字符串中的相对位置;
也就是说,我们只要将大写字符与后面出现的小写字符进行对调就可以了。
我所采用的策略是,先找到第一个大写字符出现的位置,用j表示;
然后继续遍历字符串,当遇到小写字符时,与j位置上的大写字符交换。并对j加1。
直到遍历到字符串末尾。
也就是说,我们只要将大写字符与后面出现的小写字符进行对调就可以了。
我所采用的策略是,先找到第一个大写字符出现的位置,用j表示;
然后继续遍历字符串,当遇到小写字符时,与j位置上的大写字符交换。并对j加1。
直到遍历到字符串末尾。
实现代码:
class Solution
{
public:
/**
* @param chars: The letters array you should sort.
*/
void sortLetters(string &letters)
{
int j = 0;
while (letters[j] >= 'a')
{
j++;
}
for (int i = j; i < letters.size(); i++)
{
if (letters[i] >= 'a')
{
char tmp = letters[i];
letters[i] = letters[j];
letters[j] = tmp;
j++;
}
}
return;
}
};
代码说明:
在实现代码中,我先用while循环找到第一个大写字符出现的位置,接着用for循环找字符后面的小写字符,若有则与大写字符交换位置,
使其位置位于大写字符的前面。
当然,我们也可以用双指针来做这道题。
一个在头部,一个在尾部,循环从头部开始,结束条件是两个指针相遇。
当头指针遇到大写字符时,将其与尾部指针的字符对调。
双指针实现代码:
在实现代码中,我先用while循环找到第一个大写字符出现的位置,接着用for循环找字符后面的小写字符,若有则与大写字符交换位置,
使其位置位于大写字符的前面。
当然,我们也可以用双指针来做这道题。
一个在头部,一个在尾部,循环从头部开始,结束条件是两个指针相遇。
当头指针遇到大写字符时,将其与尾部指针的字符对调。
双指针实现代码:
class Solution {
public:
/**
* @param chars: The letters array you should sort.
*/
void sortLetters(string &letters)
{
for (int i = 0, j = letters.size() - 1; i < j;)
{
if (letters[i] < 'a')
{
char tmp = letters[i];
letters[i] = letters[j];
letters[j] = tmp;
j--;
} else
{
i++;
}
}
}
};