您的位置:首页 > 编程语言

编程挑战(7)

2013-07-13 20:12 78 查看
/*
1: 问题的提出:
我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同,
而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。
例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77.

2:问题的转化:
要得到一个字符串最大的完美度,肯定要给出现频率最大字符分配的完美度最大,从26开始以此来分配

*/

#include "stdafx.h"
#include <string>
#include <set>
#include <iostream>

using namespace std;

//判断一个字符是否在 'a'--'z', or 'A'--'Z'
bool legalch(char ch)
{
bool legal = false;
if ((ch >='a' && ch <= 'z') || (ch >='A' && ch <= 'Z'))
{
legal = true;
}
return legal;
}

//把一个字符转化为小写
char lowerchar(char ch)
{
if(ch >='A' && ch <= 'Z')
{
return ch + 'a' - 'A';
}
else
{
return ch;
}
}

//把一个字符串全部转换为小写
bool lowerstring(string & str)
{
bool result = true;
for(unsigned int i = 0; i < str.length(); i++)
{
if (legalch(str.at(i)) && lowerchar(str.at(i)))
{
str.replace(i, 1, 1, lowerchar(str.at(i)));
}
else
{
result = false;
break;
}
}
return result;
}

//求一个字符串的perfect 值,如果字符串包含非26个英文字母的大小写,则返回0
int perfect(string &str)
{
int value = 0;
char result[26];
memset(result, 0, 26);

if (lowerstring(str))
{
for(unsigned int i = 0; i < str.length(); i++)
{
result[str.at(i) - 'a']++;
}

//更换存储结构
typedef struct record
{
char  ch;
int   count;
int   perfect;
}RECORD;

RECORD rec[26];
int number = 0;
for(int i=0; i<26; i++)
{
if (result[i] != 0)
{
rec[number].ch = i + 'a';
rec[number].count = result[i];
rec[number].perfect = 0;
number++;
}
}

//排序
for(int i=0; i<number; i++)
{
for(int j=i; j<number; j++)
{
if (rec[i].count < rec[j].count)
{
RECORD temp = rec[i];
rec[i] = rec[j];
rec[j] = temp;
}
}
}
for(int i=0; i<number; i++)
{
rec[i].perfect = 26 - i;
value = value + rec[i].count * rec[i].perfect;
printf("%c %d %d\n", rec[i].ch, rec[i].count, rec[i].perfect);
}
}
else
{
cout<<str << " is illegal" <<endl;
}
return value;
}

int _tmain(int argc, _TCHAR* argv[])
{
string str = "dad";
int pervalue = perfect(str);
printf("perfect value=%d\n", pervalue);
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: