一、原题
链接: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 stringint 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;}