• 编程挑战(7)


    /*
    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
    ", 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
    ", pervalue);
    	getchar();
    	return 0;
    }
    


  • 相关阅读:
    RP2833 FPGA对应串口标识
    rp2833 网卡以及串口与接插件位置关系
    环境检测 短信收发的测试
    #A号板测试汇总
    #8号板测试汇总
    #2号板测试汇总
    #6号板问题
    【POJ3045】Cow Acrobats(贪心)
    【HDU1219】AC Me(水题)
    BUPT2017 wintertraining(15) #2 题解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3188488.html
Copyright © 2020-2023  润新知