Leetcode389找不同

题目详情

 

方法1:转换为数组

将字符串存放到数组中,将t数组减去s数组的元素,得到的就是想要值 

python代码的实现

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        s_list = list(s)
        t_list = list(t)
        for i in s_list:
            t_list.remove(i)

        return t_list[0]

c++代码实现

C++数组实现,可以考虑哈希表

        vector<int> cnt(26, 0);  //大小为26
        //字符串a的数值最小为96
        for (char ch: s) {
            cnt[ch - 'a']++;     //将将"a" 对应 0 b对应1 放到哈希表中
        }
        for (char ch: t) {
            cnt[ch - 'a']--;    //将将"a" 对应 0 b对应1 移除哈希表中
            if (cnt[ch - 'a'] < 0) {
                return ch;     //返回此时的字符
            }
        }
        return ' ';

方法2:转ASIIC

 每个字符都会对应这一个专有的ASllC码,可以放入到哈希表中,将两个表相减

得出目标字符的ASIIC码

python中:转ASIIC函数 ord( )    ASIIc转为字符chr()

c++中:    转ASIIC码函数

python代码实现

     #转为ASCII码
        a_s = 0 
        a_t = 0 
        for i in range(len(s)):
            i_int = ord(s[i])
            a_s += i_int
        for i in list(t):
            i = ord(i)
            a_t += i
        return chr(a_t - a_s)

c++代码实现

ASIIC值法:对s的所有字符转为ASIIC值进行累加,然后对t的所有ASSIIC值进行累加,将两个累加值进行相减就是得到的目标字符的ASIIC然后将其转为字符

注:auto关键字 可以自动将i转换为asllc码,同时返回的ascll转为字符  

也可以用char

  // ASCII值相减法
        int a_s =0; 
        int a_t = 0;
        for(auto i:s)
        {
            a_s += i ;
        }
        for (auto i : t)
        {
            a_t += i;
        }

        return a_t-a_s;

 

 

 

方法3:一些漂亮技巧

利用collections标准库中的couter()

构建一个出现字母的字典,返回字典值最后存续的那个字母即可

代码

时间复杂度:O(n)。遍历计数即可。
空间复杂度:O(1)。只会用到常数个额外空间。 

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        return list(Counter(t) - Counter(s))[0]

 

 异或:

相关知识:

一个数和0做XOR运算等于本身:a⊕0 = a
一个数和其本身做XOR运算等于 0:a⊕a = 0
XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b

使用字符(注意不是字符串)异或运算

因为t比s只多了一个字符,故而:两个字符串中相同部分加在一起将是偶数,那个不同的字符加在一起将是奇数。

这不是那个「只有 1 个数字出现了奇数次,其它数字全部出现偶数次,找出出现奇数次的数字」的经典问题嘛,全部异或即可解决!对于字母也是一样的

       int ret = 0;
        for (char ch: s) {
            ret ^= ch;
        }
        for (char ch: t) {
            ret ^= ch;
        }
        return ret;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值