字符大小写排序(LintCode)

题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/sort-letters-by-case/
题目:

给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序。

您在真实的面试中是否遇到过这个题?  
Yes
样例

给出"abAcD",一个可能的答案为"acbAD"

注意

小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置。

挑战

在原地扫描一遍完成

难度级别:
中等

思路分析:
首先,我们需要注意的是,此题并未要求对字符进行排序,且小写字母或者大写字母他们之间不一定要保持原字符串中的相对位置;
也就是说,我们只要将大写字符与后面出现的小写字符进行对调就可以了。
我所采用的策略是,先找到第一个大写字符出现的位置,用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循环找字符后面的小写字符,若有则与大写字符交换位置,
使其位置位于大写字符的前面。
当然,我们也可以用双指针来做这道题。
一个在头部,一个在尾部,循环从头部开始,结束条件是两个指针相遇。
当头指针遇到大写字符时,将其与尾部指针的字符对调。

双指针实现代码:
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++;
			}
		}
	}
};



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值