码迷,mamicode.com
首页 > 编程语言 > 详细

华为OJ—字符串排序

时间:2015-03-17 21:48:45      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

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 = 0;        //非英文字母数
    char* pArr = new char[len + 1];
    for (int i = 0; i <= len; i++)        //结果集置为空
        pArr[i] = \0;

    //先把非字符串填充到结果pArr中
    for (int i = 0; i < len; i++)
    {
        if ((str[i] >= 65 && str[i] <= 90) || (str[i] >= 97 && str[i] <= 122))
        {
            continue;
        }
        else
        {
            pArr[i] = str[i];
            noChCnt++;
        }
    }

    //提取出待排序字符
    char* pSortArr = new char[len - noChCnt];
    int ii = 0;
    for (int j = 0; 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 = 0;
    for (int j = 0; 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 0;
}

//注意:这个排序算法必须是稳定的,要不然不满足规则2
void mySort(char* pArr, int n)
{
    //冒泡排序
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (tolower(pArr[j + 1]) < tolower(pArr[j]))
            {
                char ch = pArr[j + 1];
                pArr[j + 1] = pArr[j];
                pArr[j] = ch;
            }
        }
    }
}
View Code

 

 

 

华为OJ—字符串排序

标签:

原文地址:http://www.cnblogs.com/jiayith/p/4345442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!