http://career-oj.huawei.com/exam/ShowProblemInfo?id=2168

编写一个程序,将输入字符串中的字符按如下规则排序。

规则1:英文字母从A到Z排列,不区分大小写。

如,输入:Type 输出:epTy

规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入:BabA 输出:aABb

规则3:非英文字母的其它字符保持原来的位置。

如,输入:By?e 输出:Be?y

样例:

输入:

A Famous Saying: Much Ado About Nothing(2012/8).

输出:

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).




解答:

  其实就是一个从小到大的排序。

  规则2的意思就是这个排序算法必须是一个稳定的算法,冒泡可以,选择就不是稳定的了。这点必须得看出来!

  规则3基本上可以忽略,只要在冒泡排序的时候判断两个都是字母且tolower(ch)前大后小才交换即可,这样就不要管那些非字母了。



总结:

  开始做之前考虑好是否有更好的方法。我的做法是把原来字符串中所有字母提取出来(非字母保持不动),放到了一个新开辟的数组里面,然后对它们进行排序,最后再把排好序的填回到那些非字母保持不动的字符串中。这里空间效率就很低了。我的低效代码:

#include <iostream>
#include <string>
#include <cctype> using namespace std; void mySort(char* pArr, int n); //#define DEBUG int main(void)
{
string str;
getline(cin, str); int len = str.length();
int noChCnt = ; //非英文字母数
char* pArr = new char[len + ];
for (int i = ; i <= len; i++) //结果集置为空
pArr[i] = '\0'; //先把非字符串填充到结果pArr中
for (int i = ; i < len; i++)
{
if ((str[i] >= && str[i] <= ) || (str[i] >= && str[i] <= ))
{
continue;
}
else
{
pArr[i] = str[i];
noChCnt++;
}
} //提取出待排序字符
char* pSortArr = new char[len - noChCnt];
int ii = ;
for (int j = ; j < len; j++)
{
if ('\0' == pArr[j])
pSortArr[ii++] = str[j];
}
#ifdef DEBUG
cout << pSortArr << endl;
#endif //下面排序
mySort(pSortArr, len - noChCnt);
#ifdef DEBUG
cout << pSortArr << endl;
#endif //填结果
ii = ;
for (int j = ; j < len; j++)
{
if ('\0' == pArr[j])
pArr[j] = pSortArr[ii++];
} cout << pArr; delete[] pSortArr;
delete[] pArr; #ifdef DEBUG
while (true)
cin.get();
#endif return ;
} //注意:这个排序算法必须是稳定的,要不然不满足规则2
void mySort(char* pArr, int n)
{
//冒泡排序
for (int i = ; i < n - ; i++)
{
for (int j = ; j < n - i - ; j++)
{
if (tolower(pArr[j + ]) < tolower(pArr[j]))
{
char ch = pArr[j + ];
pArr[j + ] = pArr[j];
pArr[j] = ch;
}
}
}
}

华为OJ—字符串排序(排序,忽略指定字符排序)的更多相关文章

  1. [Swift]字符串根据索引获取指定字符,依据ASCII实现字符和整数的相互转换

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  2. C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?

    C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?这是一个很常见的命题,以前也没有注意,今天QQ群里有人提起,于是就做了下试验,代码如下: using System; u ...

  3. PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符

    trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...

  4. jQuery动态添加的元素中处理字符串溢出后在指定字符数后添加省略号

    "+[jsonData[i].questitle.lenth>40?jsonData[i].questitle.substring(0,40)+"...":json ...

  5. 华为OJ—火车进站(栈,字典排序)

    http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282 给定一个正整数N代表火车数量,0<N&l ...

  6. js中去掉字符串中的某个指定字符

    假设一个data里面的数据是[tian,12],现在去掉[],代码如下 data=data.replace("[",""); data=data.replace ...

  7. 华为oj 字符串最后一个单词的长度

    <img alt="http://img.bbs.csdn.net/upload/201508/06/1438867109_670158.jpg" src="htt ...

  8. JS字符串截取(获取指定字符后面的所有字符内容)

    function getCaption(obj){     var index=obj.lastIndexOf("\-");     obj=obj.substring(index ...

  9. JS自定义去除字符串左右两边的指定字符

    function ltrim(str,char){ var pos = str.indexOf(char); var sonstr = str.substr(pos+1); return sonstr ...

随机推荐

  1. Python语言快速入门

    Python的主提示符(>>>):是解释器告诉你它正在等待你输入的下一个语句 Python的次提示符(...):告诉你解释器正在等待你输入当前语句的其他部分 [简介] Python( ...

  2. Ubuntu离线安装包制作(转载)

    From:http://blog.csdn.net/nupt123456789/article/details/11649603 1.应用场景 a.需要在多台电脑上安装同一软件,且软件很大,下载需要时 ...

  3. nvelocity模板引擎

    using NVelocity.App;using NVelocity.Runtime;using NVelocity; VelocityEngine vltEngine = new Velocity ...

  4. ruby中的reject和reject!

    reject和reject!reject返回不满足代码块的元素数组reject!删除数组中满足代码块的元素 a=[1,2,3,5]a.reject! {|x| x<4}p a #[5] b = ...

  5. DataTable的Merge使用

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.T ...

  6. Quartz CronTrigger配置

    关于cron表达式(来自网络): Cron 表达式包括以下 7 个字段: 秒 分 小时 月内日期 月 周内日期 年(可选字段) 特殊字符 Cron 触发器利用一系列特殊字符,如下所示: 反斜线(/)字 ...

  7. ubuntu命令查补

    Linux删除目录的命令有:rm,rm命令删除目录虽说比较简单,不过一旦所操作的目录非空时,就会让你陷入深深的苦恼之中 rm -rf 目录名字: -r 就是向下递归,管理有多少级目录,一并删除 -f ...

  8. 一个类似bootstrap的foundation

    提供了和BOOTSTRAP一样的功能,但明显比bootstrap有更好的效果 比如 <button> 直接就添加了样式了. http://www.foundcss.com/ Bootstr ...

  9. sql如何获取一个时间段内的月份

    ),) from master..spt_values where type='P' and dateadd(month,number,'2010-01-01')<='2010-09-01' / ...

  10. [ZOJ 1011] NTA (dfs搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011 题目大意:在一棵树上,给你起始状态,问你能否到达终止状态. ...