zoukankan      html  css  js  c++  java
  • 每日一题:华为初级题库——名字的漂亮度

      <题目要求>

      要求输入N个字符串(由大小写字母组成),要求输出每个字符串的最大“漂亮度”。定义每个字母都有一个不重复的“漂亮度”(即可以从1-26任选一个值),而一个字符串的“漂亮度”,就是累加所有字母的“漂亮度”(字母选择不同的值,“漂亮度”就不同)。

    输入: 2
    zhangsan
    lisi
    输出: 192
    101

      思路:这个题目题意有点深奥,但是读懂了,就会比较简单。“漂亮度”,即给每个字母赋值,要求最大的“漂亮度”,即先统计出现字母的类型以及其个数,然后给个数大的字母赋予大的“漂亮值”。例如:“zhangsan”中,a出现2次,n出现2次,z/h/g/s各出现1次,则给a、n从26、25中取值,给z、h、g、s从24、23、22、21中取值,即可实现取最大“漂亮度”。

      易错点分析:

    (1)在上传答案到华为题库的时候,不要多输入其他废话,按照其要求的输入(先输入N的值,再依次输入N个字符串),按照其要求计算“漂亮度”,再按要求输出(输出字符串的漂亮度);

    (2)一维数组、二维数组在栈中的开辟内存(当然也可以直接在常量区分配,即采用a[3][10]这种形式);

    (3)数组的初始化(若是在定义时,给第一个赋值,即给所有赋值,例如int a[10]={0}的形式,也可采用memset(a,0,sizeof(a)/sizeof(int)),或是利用for语句循环赋值);

    (4)重复利用中间变量的时候,要进行0的初始化;

    (5)在利用变量的时候,for(int i;i<n;i++)这种形式固然好用,但要注意在这之外的非循环体内,是否有int i的定义,即在for语句之外,还有一个int i来记录临时变量,就会导致变量冲突。

    #include <iostream>
    using namespace std;
    int SortTheLetter(int *b);
    int main()
    {
        int n;
        int i=0;
        char *p;
        int t;
        int b[26];//用0-25索引号来表示英文字母
        for(int j=0;j<26;j++)//用数组的值于记录字母出现的个数,此处利用了循环来初始化
        {
            b[j]=0;
        }
        cin>>n;
        int *c=new int[n];//一维数组在堆中分配内存空间的用法
        char **a=new char* [n];//二维数组在堆中分配内存空间的用法,包括以下循环;
        for(int j=0;j<n;j++)
        {
            a[j]=new char[26];
        }
        //若用堆分配内存空间,应为以下:
        //char *a[n];
        while(i<n)
        {
            cin>>a[i];//从字符串中输入字符的时候,是会自动添加‘’这个结尾符号的。
            i++;
        }
    
        i=0;
        while(i<n)
        {
            //cout<<a[i]<<endl;利用char*的特殊性,可以用指针地址,直接输出整个字符串。
            p=a[i];
    
            while(*p!='')
            {
                if('a'<=*p&&*p<='z')
                    t=*p-'a';
                else if('A'<=*p&&*p<='Z')
                    t=*p-'A';
                b[t]++;
                p++;
            }
            c[i]=SortTheLetter(b);
            for(int j=0;j<26;j++)
                b[j]=0;//重新记录的时候,要记得初始化;
            i++;
        }
        i=0;
        while(i<n)
        {
            cout<<c[i]<<endl;
            i++;
        }
        return 0;
    }
    int SortTheLetter(int *b)
    {
        int max;
        int tmp;
        int tmp0=26;
        int sum=0;
        for(int k=0;k<26;k++)
        {
            max=k;
            for(int j=k+1;j<26;j++)
            {
                if(b[j]>b[max])
                {
                    max=j;
                }
            }
            if(k!=max)
            {
                tmp=b[k];
                b[k]=b[max];
                b[max]=tmp;
            }
        }
        for(int i=0;b[i]!=0&&i<26;i++)
        {
            tmp=b[i]*tmp0;
            tmp0--;
            sum+=tmp;
        }
        return sum;
    }
  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/Sophie-nature/p/3676000.html
Copyright © 2011-2022 走看看