leetcode刷刷题(18) ---- 找不同(C语言版)

2019-11-17
  • It’s great to have dreams.
    有梦想是好事。
题目
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。

示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人解答:(C版本)
  • 第一想法就是想到先将两个字符串进行排序(字母是数字的ASCII 表示,可以当做数字对待),然后从头开始比较,找到不同,即为被添加的字母。
  • 方法可行,就是效率太低,看了评论区大神的答案,羞愧难当。
/*交换两个整形值*/
void mySwap(char *pa, char *pb)
{
    char tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
/*冒泡排序*/
void bubbleSort(char *arr, int arr_size)
{
    /*isLoop用于指示依次遍历中是否发生元素交换,若没有,则已是有序数列,退出即可*/
    int isLoop = true;
    for (int i = arr_size-1; (true == isLoop) && i > 0; i--)
    {
        isLoop = false;
        for (int j = 0; j < i; j++)
        {
            if (arr[j] > arr[j+1])
            {
                mySwap(&arr[j], &arr[j+1]);
                isLoop = true;
            }
        }
    }
}

char findTheDifference(char * s, char * t){
    int i=0;
    bubbleSort(s, strlen(s)); // 排序
    bubbleSort(t, strlen(t)); // 排序

    for(i=0; i<strlen(s); i++)
    {
        if(s[i] != t[i])  //找到不同,即为所求
        {
            return t[i];
        }
    }

    return t[i]; //前面没找到,说明添加的是最后一位
}

在这里插入图片描述

他山之石:
  • 想到位操作的都是大神呀
    前提:数字与自身异或结果为0。
    那么我们可以将两个字符串异或,剩下的就是被添加的,效率杠杠的。
    异或的性质如下:
    在这里插入图片描述
    利用上面的第1条和第三条,使用C语言实现如下:
char findTheDifference(char * s, char * t){
    char res;

    res = t[strlen(t)-1]; // t字符串最后一个字母
    //将两个字符串的字母分别异或,最后剩下的就是所求
    for(int i=0; i<strlen(s); i++) 
    {
        res ^= s[i]^t[i]; 
    }

    return res;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值