每日一题:华为初级题库——名字的漂亮度
<题目要求>
要求输入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];//从字符串中输入字符的时候,是会自动添加‘\0’这个结尾符号的。 i++; } i=0; while(i<n) { //cout<<a[i]<<endl;利用char*的特殊性,可以用指针地址,直接输出整个字符串。 p=a[i]; while(*p!='\0') { 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; }
posted on 2014-04-20 10:36 Sophie@原本 阅读(1781) 评论(0) 编辑 收藏 举报