华为OJ—字符串排序(排序,忽略指定字符排序)
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—字符串排序(排序,忽略指定字符排序)的更多相关文章
- [Swift]字符串根据索引获取指定字符,依据ASCII实现字符和整数的相互转换
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...
- C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?
C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?这是一个很常见的命题,以前也没有注意,今天QQ群里有人提起,于是就做了下试验,代码如下: using System; u ...
- PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符
trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...
- jQuery动态添加的元素中处理字符串溢出后在指定字符数后添加省略号
"+[jsonData[i].questitle.lenth>40?jsonData[i].questitle.substring(0,40)+"...":json ...
- 华为OJ—火车进站(栈,字典排序)
http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282 给定一个正整数N代表火车数量,0<N&l ...
- js中去掉字符串中的某个指定字符
假设一个data里面的数据是[tian,12],现在去掉[],代码如下 data=data.replace("[",""); data=data.replace ...
- 华为oj 字符串最后一个单词的长度
<img alt="http://img.bbs.csdn.net/upload/201508/06/1438867109_670158.jpg" src="htt ...
- JS字符串截取(获取指定字符后面的所有字符内容)
function getCaption(obj){ var index=obj.lastIndexOf("\-"); obj=obj.substring(index ...
- JS自定义去除字符串左右两边的指定字符
function ltrim(str,char){ var pos = str.indexOf(char); var sonstr = str.substr(pos+1); return sonstr ...
随机推荐
- mysql索引之四(索引使用注意规则:索引失效--存在索引但不使用索引)
但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全 ...
- wireshark1.8捕获无线网卡的数据包——找不到无线网卡!
问题说明:奇怪的是,我线网卡明明有的,是interl的型号,可是wireshark总是找不到,如下: 奇了怪了,没有!原来是如下的: 实际上这块无线网卡是存在的,只不过由于兼容或驱动的原因无法显示型号 ...
- JAVA中复写equals方法
在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...
- Codeforces 626E Simple Skewness 「数学」「二分」
题意: 给你一堆无序数,寻找它的一个子堆,使得子堆的平均数减中位数最大. 数字的个数n<=2e5 0<=xi<=1e6. 思路: 首先可以证明这堆数一定是奇数个,证明方法是尝试在奇数 ...
- iBeacons 资源汇总
从淘宝上购买了iBeacons的开发模块,便开始要熟悉这个技术了. 先来说一下什么是iBeacons iBeacons是苹果在2013年WWDC上推出一项基于蓝牙4.0(Bluetooth LE | ...
- 蓝桥杯---地宫取宝(记忆搜索=搜索+dp)
题目网址:http://lx.lanqiao.org/problem.page?gpid=T120 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值 ...
- Mongdb操作嵌套文档
1.一个文档如下 db.posts.find() { "_id" : ObjectId("5388162dfc164ee1f39be37f"), "t ...
- Spark On Yarn:提交Spark应用程序到Yarn
转载自:http://lxw1234.com/archives/2015/07/416.htm 关键字:Spark On Yarn.Spark Yarn Cluster.Spark Yarn Clie ...
- 错误记录,找不到sqlite dll
Could not load file or assembly'System.Data.SQLite.dll' or one of its depedencies.找不到指定模块. 在CSDN找到解决 ...
- java cmd 命令
java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完d ...