您的位置:首页 > 产品设计 > UI/UE

leetcode-Sort Characters By Frequency(基数排序实现)

2017-02-28 17:48 405 查看
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.这道题是在堆的练习中出现,考虑堆的实现方式,暂时没想出来 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: