Hj026 字符串排序

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

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

如,输入: Type 输出: epTy

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

如,输入: BabA 输出: aABb

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

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

数据范围:输入的字符串长度满足 1≤n≤1000 

输入描述:

输入字符串

输出描述:

输出字符串

示例1

输入:

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

输出:

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
// c解法一:(原创)
#include 
#include 

int main()
{
    char strLet[1001] = {0}; // 字母缓存数组
    char ch = '0';
    int sumLet = 0; // 字母个数
    char strOth[1001] = {0}; // 其他字符缓存
    int sum = 0;
    while (scanf("%c", &ch) != EOF) {
        if (ch == '\n') {
            break;
        }
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
            int size = strlen(strLet);
            // 从第一个输入的字母就开始按要求排序,后边的字符只要根据要求找到自己插入的位置即可,不需要整个数完全遍历
            for (int i = 0; i < size; i++) {
                // 需要调整顺序
                if (((strLet[i] >= 'a' && strLet[i] <= 'z') && (ch >= 'a' && ch <= 'z') && (ch < strLet[i]))
                 || ((strLet[i] >= 'a' && strLet[i] <= 'z') && (ch >= 'A' && ch <= 'Z') && (ch < (strLet[i] - 32)))
                 || ((strLet[i] >= 'A' && strLet[i] <= 'Z') && (ch >= 'a' && ch <= 'z') && (ch < (strLet[i] + 32)))
                 || ((strLet[i] >= 'A' && strLet[i] <= 'Z') && (ch >= 'A' && ch <= 'Z') && (ch < strLet[i]))) {
                    // 字符插入,数组中插入位置前面的字符不动,插入位置后边的字符往后移动一个
                    for (; size > i; size--) {
                        strLet[size] = strLet[size - 1];
                    }
                    strLet[size] = ch;
                    sumLet++;
                    sum++;
                    break;
                }
            }
            // 如果没有进行字符插入操作则在尾部添加
            if (size == sumLet) {
                // 尾部添加字母
                strLet[sumLet++] = ch;
                sum++;
            }
        } else {
            // 尾部添加其他字符
            strOth[sum++] = ch;
        }
    }
    int indexLet = 0;
    for (int i = 0; i < sum; i++) {
        if (strOth[i] != '\0') {
            printf("%c", strOth[i]);
        } else {
            printf("%c", strLet[indexLet++]);
        }
    }
    printf("\n");
    
    return 0;
}

// c解法2:
#include 
#include 

void sort(char *strIn, char *strLet)
{
    int index = 0;
    int len = strlen(strIn);
    for (char i = 'A'; i <= 'Z'; ++i) {
        for (int j = 0; j < len; ++j) {
            if (strIn[j] == i || strIn[j] == i + 32) {
                strLet[index++] = strIn[j];
                strIn[j] = 0;
            }
        }        
    }
}

int main()
{
    char strIn[1001] = {0}; // 输入字串缓存
    char strLet[1001] = {0}; // 字母缓存数组
    scanf("%[^\n]", strIn);
    int len = strlen(strIn);

    sort(strIn, strLet);
    int index = 0;
    for (int i = 0; i < len; i++) {
        if (strIn[i] != '\0') {
            printf("%c", strIn[i]);
        } else {
            printf("%c", strLet[index++]);
        }
    }
    printf("\n");
    
    return 0;
}

// cpp解法1:
#include 
#include 
#include 

using namespace std;

void sort(std::string & strIn, std::vector & strLet)
{
    int index = 0;
    for (char i = 'A'; i <= 'Z'; ++i) {
        for (int j = 0; j < strIn.size(); ++j) {
            if (strIn[j] == i || strIn[j] == i + 32) {
                strLet.push_back(strIn[j]);
                strIn[j] = 0;
            }
        }        
    }
}

int main()
{
    std::string strIn;
    std::vector strLet;

    getline(cin, strIn);
    sort(strIn, strLet);

    int index = 0;
    for (auto & ch : strIn) {
        if (ch != '\0') {
            std::cout << ch;
        } else {
            std::cout << strLet[index++];
        }
    }
    std::cout << std::endl;
    
    return 0;
}

你可能感兴趣的:(机考刷题00,c++)