每日一题:华为初级题库——名字的漂亮度

  <题目要求>

  要求输入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;
}
原文地址:https://www.cnblogs.com/Sophie-nature/p/3676000.html