码迷,mamicode.com
首页 > 其他好文 > 详细

华为机试—字母权重分配方案

时间:2015-05-12 11:34:34      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:华为机试   字母权重分配方案   哈希存储   哈希   

题目:

两段长度为1-5000变换的单词word1,word2,设计一个字母权重分配方案:该方案中不区分大小写字母;该方案A-Z的字母唯一对应一个1-26的数;该方案满足word1的字母权重和与word2的字母权重和的差值最大 。


基本思想:
这个问题是实质是比较单词,剔除相同的部分,看哪个剩余部分多,剩余多的单词部分再进行一个字母频率从大到小排列,频率最高的给最大的权重——26,频率低一些的依次给剩余的最大权重;剩余的单词部分再进行一个字母频率也是从大到小排列,只不过频率最高的给最小的权重——1,频率高一些的依次给剩余的最小权重。
至于实现,若是先直接比较单词,再字母频率统计,工作量有点大。可以考虑直接用 字母表A-Z为索引,将单词装换为字母表A-Z的编码(更形象点,即将杂乱的单词变成一个26进制数,当然这样没有包含单词的全部信息——字母在单词中的排序就不知道,所以可以装换成26个节点,每个节点还含有一个排序数组,如单词daddy,相对应的d节点下就含有一个size为3的数组,有sn[‘d‘][3]={0,2,3}。当然本题只需要一个量就是size[‘d‘]=3。)

#include <iostream>
#include <string>
#include <vector> 
using namespace std;

int main()
{
    string str1,str2;
    cin  >> str1 >> str2;
    int i = 0 ,j =0;
 
    vector<int> status1(26,0);
    vector<int> status2(26,0);
    vector<int> diff(26,0);
    vector<int> negative(26,0);   
    vector<int> positive(26,0);   
	
    int cntNeg = 0 , cntPos = 0;
    for( i = 0; i< str1.size(); i++)//字符串字符的哈希存储,存储每个字符的次数
    {
        char c = str1[i];
        if( 'a'<=c && c <= 'z' ){
            status1[c -'a' + 0]++;
        }
        if( 'A'<=str1[i] && str1[i] <= 'Z' ){
            status1[c-'A'+ 0]++;
        }
    }
    for( i = 0; i< str2.size(); i++)
    {
        char c = str2[i];
        if( 'a'<=str2[i] && str2[i] <= 'z' ){
            status2[c -'a' + 0]++;
        }
        if( 'A'<=str2[i] && str2[i] <= 'Z' ){
            status2[c -'A' + 0]++;
        }
    }

 
    for( i = 0; i< 26; i++)
	{
        diff[i] = status2[i] - status1[i];
        if(diff[i]<0)
        {
            negative[i] = -diff[i];
            cntNeg += negative[i];
        }
        else
        {
            positive[i] = diff[i];
            cntPos += positive[i];
        }
    }

    for( i = 0; i< 26; i++)
        cout << status1[i] <<' '<< status2[i] <<' '<< diff[i] << endl;
 
    int tmp= 0;
    int a[26],b[26];
    cout << cntNeg <<' '<< cntPos<<endl;

    for( i = 0 ; i < 26;i++ )
    {
        a[i] = 26-i;
        b[i] = i+1;
    }
 
    for( i = 0 ; i < 26;i++ )//对单词差值剩余的字符次数排序
        for(j = i+1 ;j <26;j++)
        {
            if( negative[i] < negative[j] ){
                tmp = negative[i];
                negative[i] = negative[j];
                negative[j] = tmp;
            }
        }
    for( i = 0 ; i < 26;i++ )
        for(j = i+1 ;j <26;j++)
        {
            if( positive[i] < positive[j] ){
                tmp = positive[i];
                positive[i] = positive[j];
                positive[j] = tmp;
            }
        }
 
    int out=0 , large = 0, small =0 ;
    for( i = 0 ; i < 26;i++ )
    {
        if( cntNeg >= cntPos  ) {
            large += a[i]*negative[i];   
            small += b[i]*positive[i];
        }           
        else{
            large += a[i]*positive[i];
            small += b[i]*negative[i];
        }
    }
 
    out = large - small;
    cout << "权重差值:"<<out <<endl;
 
    return 0;
}

技术分享


最终权重差值:

单词1比单词2多两个d和一个a,所以设定的d的权重为26,a的为25。

权重差值=26+26+25=77.

华为机试—字母权重分配方案

标签:华为机试   字母权重分配方案   哈希存储   哈希   

原文地址:http://blog.csdn.net/wtyvhreal/article/details/45665371

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!