一、题目
函数原型:char findTheDifference(char * s, char * t)
二、思路
作者原先的思路是先将两个字符串从小到大排序,然后两个字符串依次比较。若出现字符串t中的元素和字符串s不相等,则说明该元素就是被添加的字母。
但是,该算法时间上仅仅击败13.33%的人,效率极低。
int cmp(const void *e1,const void *e2) {return *(char*)e1 - *(char*)e2; }char findTheDifference(char * s, char * t){int sz1=strlen(s);int sz2=strlen(t);qsort(s,sz1,1,cmp);qsort(t,sz2,1,cmp);int i=0;for(i=0;i<sz1;i++){if(s[i]!=t[i]&&s[i]==t[i+1]){return t[i];}}return t[i]; }
下面介绍几种时间效率比较高的算法:
思路1:
利用找单身狗的思想,详见:《leetcode:136. 只出现一次的数字(找单身狗)》
将两个字符串全部进行异或运算,最后得到的就是只出现一次的字母,即被添加的字母
char findTheDifference(char* s, char* t) {char result=0;int sz1=strlen(s);int sz2=strlen(t);for(int i=0;i<sz1;i++){result^=s[i];}for(int i=0;i<sz2;i++){result^=t[i];}return result; }
思路2:
用字符串t的字母总和减去字符串s的字母总和,因为相同字母相减结果为0,所以剩下的就是被添加的字母
char findTheDifference(char* s, char* t) {char result=0;int sz1=strlen(s);int sz2=strlen(t);for(int i=0;i<sz2;i++){result+=t[i];}for(int i=0;i<sz1;i++){result-=s[i];}return result; }
思路3:
设置一个大小为26的数组(初始值为0),字母 a-z 分别对应位置 0-25 ,通过各字母通过减去a可以转换为对应的数字。先遍历字符串s,当某个字母出现其对应的位置就+1;再遍历字符串t,当某个字母出现其对应位置就-1。最后若某个位置变为了-1,说明该字母在s中未出现,在t中出现了,该字母就是被添加的字母,返回该字母即可。
char findTheDifference(char* s, char* t) {int nums[26]={0};memset(nums,0,sizeof(nums));int sz1=strlen(s);int sz2=strlen(t);for(int i=0;i<sz1;i++){nums[s[i]-'a']++;}for(int i=0;i<sz2;i++){nums[t[i]-'a']--;if(nums[t[i]-'a']==-1)return t[i];}return ' '; }