【按照字符出现的次数从高到低重新排列字符串】

现有一串长度随机的,由大小写字母组成的,乱序字符串。字母可以重复出现,大小写字母视作不同字符。现在按照字符出现的次数从高到低重新排列字符串。
不同字母出现的次数不会相同。

【样例输入1】 shusmshuuu【样例输出1】uuuussshhm
【解析1]u出现了4次,s出现了3次,h出现了2次,m出现了1次【样例输入2】aAaAab
【样例输出2】aaaAAb
【解析2】a出现了3次,A出现了2次,b出现了1次

注:不允许使用编程语言自带的算法函数(如字符串处理、排序等等),否则零分处理。仅需要实现solution函数,无需自行实现输入输出函数,请勿修改solution函数以外某他函数。

typedef pair<char, int> PAIR;

struct CmpByValue {
    
        
	bool operator()(const PAIR& lhs, const PAIR& rhs) {
    
        
		return lhs.second > rhs.second;    
	}    
};

string solution(string data){
    
    
	map<char,int,greater<char>> tmp;
	for(auto x:data){
    
    
		tmp[x]++;
	}
	
	vector<PAIR> num(tmp.begin(),tmp.end());//将map转成vector进行排序
	sort(num.begin(),num.end(),CmpByValue());
	
	string ans="";
	for (int i = 0; i != num.size(); ++i) {
    
        
		for(int j=0;j<num[i].second;j++)
			ans+=num[i].first; 
	}
	return ans;
}

思路

利用map进行存储字母和他们出现的次数,然后对值进行排序(需要转成vector进行排序)。最后再用一个空字符串ans存储,每个字母出现几次就加入字符串ans几次。

猜你喜欢

转载自blog.csdn.net/mitongxue/article/details/127504585