我有一个2D数组,其中顶行是一行字母(字母),而底行是字母上方字母出现的频率。我们的想法是沿着顶行按频率顺序放置字母。
目前:
输入:
quickbrownfoxjumpsoverthelazydog
输出:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
11112111111111411211211111
期望的输出:
oeruabcdfghijklmnpqstvwxyz
42221111111111111111111111
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
main()
{
char string[100];
char s[26][2];
int c = 0, count[26] = {0};
printf("Enter a string\n");
gets(string);
while ( string[c] != '\0' )
{
if ( string[c] >= 'a' && string[c] <= 'z' )
count[string[c]-'a']++;
c++;
}
for ( c = 0 ; c < 26 ; c++ )
{
if( count[c] != 0 )
{
s[c][1]=c+'a';
s[c][2]= (char)(((int)'0')+count[c]);
gotoxy(c,1);
printf("%c",s[c][1]);
gotoxy(c,2);
printf("%c",s[c][2]);
}
}
return 0;
}
答案 0 :(得分:1)
你应该找到每个iteraton的最大值。您可以使用一些快速排序算法,但一个简单的解决方案是:
for (c=0;c<26;c++) {
int max=-1,letter,i;
for (i=0;i<26;i++)
if (count[i]>max) {
max=count[i];
letter=i;
}
count[letter]=-1;
gotoxy(c,1);
s[c][0]='a'+letter;
printf("%c",s[c][0]);
gotoxy(c,2);
s[c][1]='0'+max;
printf("%c",s[c][1]);
}
(当然,假设max <10)
答案 1 :(得分:1)
这是一种方法:取每个计数,将其向左移五,然后按位或低五位中的字母数。对结果数字进行排序,然后通过0x1F
并添加'a'
将其最不重要的五位转换回字母。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare (const void * a, const void * b) {
int ia = *(int*)a;
int ib = *(int*)b;
return (ia>>5) == (ib>>5) ? ia-ib : ib-ia;
}
int main(int argc, char* argv[]) {
char string[100] = "quickbrownfoxjumpsoverthelazydog";
int c = 0, count[26];
memset(count, 0, sizeof(count));
while ( string[c] != '\0' ) {
if ( string[c] >= 'a' && string[c] <= 'z' ) {
count[string[c]-'a']++;
}
c++;
}
// Shift the letter ordinal into the lower five bits of the count*32
for ( c = 0 ; c < 26 ; c++ ) {
count[c] = (count[c] << 5) | c;
}
// Sort the results using the custom compare function
qsort(count, 26, sizeof(int), compare);
// Print the letters by taking the lower five bits
for ( c = 0 ; c < 26 ; c++ ) {
printf("%c", 'a'+(count[c]&0x1F));
}
printf("\n");
// Print the counts by ignoring the lower five bits
for ( c = 0 ; c < 26 ; c++ ) {
printf("%d", count[c] >> 5);
}
return 0;
}
答案 2 :(得分:1)
有几件事:
s[c][0]
和s[c][1]
- 你的代码没有崩溃b / c你很幸运。c[2][26]
关于排序...因为我们只使用了26个元素而不是260万个元素,所以如何以及何时使用它并不重要。你可以做一个泡泡排序。你可以想象并构建一些双向链表并按照你的方式对它进行排序,改变元素。玩得开心!