Question:
Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input:
“tree”
Output:
“eert”
Explanation:
‘e’ appears twice while ‘r’ and ‘t’ both appear once.
So ‘e’ must appear before both ‘r’ and ‘t’. Therefore “eetr” is also a valid answer.
Example 2:
Input:
“cccaaa”
Output:
“cccaaa”
Explanation:
Both ‘c’ and ‘a’ appear three times, so “aaaccc” is also a valid answer.
Note that “cacaca” is incorrect, as the same characters must be together.
Example 3:
Input:
“Aabb”
Output:
“bbAa”
Explanation:
“bbaA” is also a valid answer, but “Aabb” is incorrect.
Note that ‘A’ and ‘a’ are treated as two different characters.
Solution:
解法1:
class Solution {
public:
#define MAX 91
#define dif 32
int fi[MAX] = {0};
string frequencySort(string s) {
if(s.empty()){
return s;
}
string res;
int len = s.size();
int f[MAX] = {0};
for(int i = 0 ; i < len ;i++){
f[s[i]-dif]++;
}
for(int i = 0 ; i < MAX ;i++){
fi[i] = i;
}
qsort(f,0,MAX);
for(int i = 0 ;i < MAX;i++){
for(int j = 0 ; j < f[i] ;j++){
/*stringstream ss;
ss.clear();
string str;
ss<<(char)(fi[i]+dif);
str = ss.str();
res+=str;*/beat 5%
res += fs[i]+dif;//beat 97%
}
}
return res;
}
void qsort(int a[],int s,int e){
if(s<e){
int m = partition(a,s,e);
qsort(a,s,m);
qsort(a,m + 1,e);
}
}
int partition(int a[],int s, int e){
int key = a[s];
int i = s;
for(int j = i+1; j < e;j++){
if(a[j] > key){
i++;
int tmp1 = a[j];
a[j] = a[i];
a[i] = tmp1;
int tmp2 = fi[i];
fi[i] = fi[j];
fi[j] = tmp2;
}
}
int tmp = a[s];
a[s] = a[i];
a[i] = tmp;
int tmp2 = fi[i];
fi[i] = fi[s];
fi[s] = tmp2;
return i;
}
};
beat 97%.
- stringstream 处理空格会忽略:
>
stringstream ss;
//ss.unsetf(std::ios::skipws);
ss.clear();
string str;
ss<<(char)(fi[i]+dif);
str = ss.str();//若使用ss>>str,空格出错
2.这么写没毛病,以前还以为char转string只能使用stringstream。
string str;
str+=(char)ch;
3.这道题是在堆的练习中出现,考虑堆的实现方式,暂时没想出来 。