Tutorial: 389. Find the Difference

题目

给定两个只含有小写字母的字符串s和t。t是打乱字符顺序之后的s,而且还在其中某个随机位置添加了一个字符c。请找出这个字符c。

算法

由于t只比s多了一个字符,我们可以认为s和t中的字母是“成对出现的”。如果我们把这些字母当做数字,那么就可以用异或操作来排除所有成对出现的字母,最后的结果就是那个多出来的字母。

例如,A⊕A=0,而A⊕A⊕B=B,我们就可以用异或来找出这个多出来的字母。

代码

//由于这个算法里面有两个循环,这是一种比较慢的解决方案
private char findTheDifference(String s, String t) {
    char result=0;
    for(int i=0;i<s.length();i++){
        result^=s.charAt(i);
    }
    for(int j=0;j<t.length();j++){
        result^=t.charAt(j);
    }
    return result;
}

//使用一个循环的算法,速度有明显提升
private char findTheDifference(String s, String t) {
    char result=0;
    int length=(s.length()>=t.length())?t.length():s.length();

    for(int i=0;i<length;i++){
        result^=s.charAt(i);
        result^=t.charAt(i);
    }

    return (s.length()>=t.length())?(char)(result^s.charAt(s.length()-1)):(char)(result^t.charAt(t.length()-1));
}

关于此文章

本文首发于作者的个人博客stormlin.com。你也扫描以下二维码来关注我的个人微信公众号来获取更多更新鲜的内容哦。
QR Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值