设 26 个英文字母,每个字母都对应一个使用频率,同一个字母的大小写使用频率相同。
现给定一个由 26 个英文字母构成的字符串,请将字符串按照字母使用频率由大到小重排,使用频率大的字母排在前面,使用频率小的字母排在后面,如果使用频率相同则按照字母顺序表排列,小写字母排在大写字母前面,即 a->A->b->B->c->C-d->D->……->z->Z。
例如 :
26 个字母的使用频率如下表 :
A(a) | B(b) | C(c) | D(d) | E(e) | F(f) | G(g) | H(h) | I(i) | J(j) | K(k) | L(l) | M(m) |
8.19 | 1.47 | 3.83 | 3.91 | 12.25 | 2.26 | 1.71 | 4.57 | 7.10 | 0.14 | 0.41 | 3.77 | 3.34 |
N(n) | O(o) | P(p) | Q(q) | R(r) | S(s) | T(t) | U(u) | V(v) | W(w) | X(x) | Y(y) | Z(z) |
7.06 | 7.26 | 2.89 | 0.09 | 6.85 | 6.36 | 9.41 | 2.58 | 1.09 | 1.59 | 0.21 | 1.58 | 0.08 |
字符串 “Thisisaexample” 重排后为 “eeTaaiisshlmpx”
字符串 “AertrtsaBereDET” 重排后为 “eeeEttTaArrrsDB”。
Input
第 1 行:一个整数 T (1≤T≤10) 为问题数。
对于每个问题,有 2 行数据,按如下格式输入:
第 1 行输入 26 个浮点数,分别表示 26 个英文字母 A(a)~Z(z) 的使用频率;
第 2 行输入一个字符串,字符串长度不超过 100 个字符,字符串由 26 个英文字母构成。
Output
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。
然后对应每个问题在一行中输出重排后的字符串。
#include <stdio.h> #include <algorithm> double p[27]; int cmp(const void * a, const void * b) { char ch1, ch2; //待比较字符 int p1, p2; //p1,p2 为ch1, ch2 在字母表中的序号 ch1=*((char *)a); ch2=*((char *)b); if (ch1 >= 'a' && ch1 <= 'z') p1 = ch1 - 'a'; else p1 = ch1 - 'A'; if (ch2 >= 'a' && ch2 <= 'z') p1 = ch2 - 'a'; else p2 = ch2 - 'A'; if(p[p1] < p[p2]) return -1; // 按字母频率排序 else if (p[p1] == p[p2]) // 字母使用频率相同 if (p1 == p2) return ch2 - ch1; //相同字母,降序排列,即小写在大写前面 else return p1 - p2; //不同字母,但使用频率相同,按字母表顺序排列 else return 1; } int main (void) { for (int i =0; i < 26; i++) scanf("%lf",&p[i]); char str[101]; scanf("%s", str); qsort(str, strlen(str),sizeof(str[0]), cmp); printf("%s\n", str); }