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. JavaScript笔记之数组 keyword(存储和释放&堆栈 & 按值 引用)

    1.数组创建及初始化 var obj=new Array(); var arr=[]; 可以延伸为长度一定的,字面量定义数组 2.堆栈 按值传递 引用类型 数组是引用类型,不是值传递, 栈:系桶自动分 ...

  2. js让iframe高度自动

    HTML: <iframe id="yb_if" width="940px" src="连接" frameborder=0 allow ...

  3. linux操作系统的分类及解释

    什么是Linux? 也许很多人会不屑的说,Linux不就是个操作系统么.错!Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核.内核是什么?内核建立了计算机软件与硬件之间通讯的平 ...

  4. R如何检验类别变量(nominal variable)与其他变量之间的相关性

    1.使用Pearson积差相关系性进行检验的话可以判断两个变量之间的相关性是否显著以及相关性的强度 显著性检验 (significant test) 连续变量 vs 类别变量 (continuous ...

  5. Spring中PropertyPlaceholderConfigurer的使用

    Spring中PropertyPlaceholderConfigurer的使用     在使用Spring配置获取properties文件时,在网上查到相关的资料,分享哈!! (1)获取一个配置文件 ...

  6. 基于NPOI的Execl导入导出例子

    源地址:http://bbs.csdn.net/topics/390830774

  7. C++学习39 异常处理入门(try和catch)

    编译器能够保证代码的语法是正确的,但是对逻辑错误和运行时错误却无能为力,例如除数为 0.内存分配失败.数组越界等.这些错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃( ...

  8. C++学习26 运算符重载的概念和语法

    所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...

  9. CRM报表打印

    删除路径下的文件 C:\Windows\Downloaded Program Files\rsclientprint.dll路径下的这个dll文件,重新登录crm选择一个面单点击打印按钮重新安装插件

  10. 山东省第五届ACM省赛

    题目链接:http://acm.sdut.edu.cn/sdutoj/contest_show.php?contest_id=1449 相关总结:http://www.cnblogs.com/mcfl ...