leetcode:389. 找不同

简介: leetcode:389. 找不同

一、题目

函数原型: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 ' ';
}


目录
相关文章
|
4月前
leetcode-1447:最简分数
leetcode-1447:最简分数
42 0
|
4月前
LeetCode
LeetCode
30 0
|
4月前
|
消息中间件 Kubernetes NoSQL
LeetCode 3、28、1351
LeetCode 3、28、1351
|
Python
LeetCode 1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
97 0
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
82 0
LeetCode 66. Plus One
LeetCode 354. Russian Doll Envelopes
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
76 0
LeetCode 354. Russian Doll Envelopes
leetcode 283 移动零
leetcode 283 移动零
50 0
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
leetcode第34题
leetcode第44题
时间复杂度:text 长度是 T,pattern 长度是 P,那么就是 O(TP)。 空间复杂度:O(TP)。 同样的,和第10题一样,可以优化空间复杂度。
leetcode第44题