首页 > 解决方案 > 按字母顺序排序上部,然后是其各自的下部,所有内容都应按排序方式

问题描述

输入字符串中不存在重复项。

Ex AbBa 输出 = AaBb

Ex = ACdac 输出 = AaCcd

Ex = ADaEedb 输出 = AabDdEe

请指导我我的代码没有为最后一个测试用例运行任何有不同想法的人请评论 lang 是否是 c++ 比我更容易理解

C++

#include<bits/stdc++.h>
using namespace std;

void swap(char *a,char *b){
char temp = *a;
*a = *b;
*b =temp;
}
int main(){
string copy1;
string s ;
cin>>s;
int j=-1;

int left = 0;
int right = s.length()-1;

while(left<right){

    if(s[left] >= 'a'  && s[right]<='z'){
        swap(&s[left],&s[right]);
        right--;
    }
    else
        left++;

}

cout<<s<<endl;
priority_queue <char, vector<char>, greater<char> > pq;
    for(int i=0;i<s.length();i++){
            if(s[i]>='A' && s[i]<='Z'){
                pq.push(s[i]);
                }
    }

    for(int i=0;i<s.length();i++){
            if(pq.empty()==false){
                char m = pq.top();
                if(find(s.begin(),s.end(),(char)(m+32))!=s.end()){
                        copy1+=(char)m;
                        copy1+=(char)(m+32);
                        pq.pop();
                    }
                else{
                copy1+=(char)m;
                pq.pop();
                }
            }
    }

cout<<copy1<<endl;

}
*/

标签: arraysstringsortingc++11priority-queue

解决方案


使用尽可能多的标准库的快速实现:

#include <cctype>
#include <algorithm>
#include <string>
#include <iostream>

int main(){
    auto compare = [](char a, char b){
        char upperA = std::toupper(a);
        char upperB = std::toupper(b);
        if(upperA != upperB) return upperA < upperB;
        if(upperA == a) return true;
        return false;
    };

    std::string input = "ADaEedbaaaaa";

    std::sort(input.begin(), input.end(), compare);
    auto endOfUniques = std::unique(input.begin(), input.end());
    input.erase(endOfUniques, input.end());
    std::cout << input << std::endl;
}

如果您绝对必须使用 std::priority_queue 而不是 std::sort,那么这个稍微不那么优雅的版本可以工作,尽管它不执行任何重复数据删除(我不清楚“字符串中不允许重复”是否是输入或输出的要求):

#include <cctype>
#include <string>
#include <iostream>
#include <queue>

int main(){
    struct compare{
        bool operator()(char a, char b){
            char upperA = std::toupper(a);
            char upperB = std::toupper(b);
            if(upperA != upperB) return upperA > upperB;
            if(upperA == a) return false;
            return true;
        }
    };

    std::string input = "ADaEedb";

    std::priority_queue<char, std::vector<char>, compare> queue;
    for(auto c : input) queue.push(c);

    std::string output;
    while(!queue.empty()){
        output += queue.top();
        queue.pop();
    }

    std::cout << output << std::endl;
}

推荐阅读