• 华为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 = 0;        //非英文字母数
        char* pArr = new char[len + 1];
        for (int i = 0; i <= len; i++)        //结果集置为空
            pArr[i] = '';
    
        //先把非字符串填充到结果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 ('' == 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 ('' == 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
  • 相关阅读:
    剑指OFFER 连续数组的最大和
    剑指OFFER 两个链表的第一个公共结点
    剑指OFFER 替换空格
    剑指OFFER 二叉树中和为某一值的路径
    剑指OFFER 二叉树的镜像
    剑指OFFER 从上往下打印二叉树
    剑指OFFER 删除链表中重复的结点
    剑指OFFER 数组中只出现一次的数字
    剑指OFFER 调整数组顺序使奇数位于偶数前面
    C 语言 sleep 函数
  • 原文地址:https://www.cnblogs.com/jiayith/p/4345442.html
Copyright © 2020-2023  润新知