一、原题
链接:Training on Two to One | Codewars
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Take 2 strings s1
and s2
including only letters from a
to z
. Return a new sorted string (alphabetical ascending), the longest possible, containing distinct letters - each taken only once - coming from s1 or s2. |
二、解题
1.分析
该题是找出字符串S1、S2共有的字符(重复的仅保留一个),将其按顺序排列,组成新字符串并返回。
2.思路
1)桶思想
遍历s1、s2,使字符与'a'做差,然后使数组a对应下标中的数值+1(即a[i]++),这种"分类"放置,是桶思想的一种应用 。
2)未知错误
若是a[30]不置为0,会发生未知错误,勇士可自行尝试。
int a[30]={0},item=0;//需要置空
3)转化、转化、再转化
说实话,这地方处理的有点绕,整体思路还可以,但应该有优化空间,下面就跟觉很绕:
*sum=(char)(i+(int)('a'));//重要
三、Myway
#include <stdlib.h>
char *longest (const char *s1, const char *s2)
{
char * sum=NULL;
sum=(char *)malloc(sizeof(char)*30);
char *p;
p=sum;
// return a nul-terminated, heap-allocated string
int a[30]={0},item=0;//需要置空
while(*s1!='\0'){
item=(int)(*s1 - 'a');
//printf("%d\n",item);
a[item]+=1;
s1++;
}
while(*s2!='\0'){
item=(int)(*s2 - 'a');
a[item]+=1;
s2++;
}
for(int i=0;i<30;i++){
//printf("%d\n",a[i]);
if(a[i]>0){
*sum=(char)(i+(int)('a'));//重要
//printf("%c\n",*sum);
sum++;
}
}
*sum='\0';
return p;
}