LeetCode 389. Find the Difference

题意

两个字符串s,t,都是小写字母,t由s中的字符和新增的一个字母随机排列组合而成,找出新增的字符!

思路

最直接的思路是HashMap,根据字符串s建立一个HashMap,key是字母,value是字母出现的次数(因为新增的字母可能本来有),再对字符串t中的每一个字符,判断是否在HashMap中,如果t中字符在HashMap中不存在,则显然是那个不同的字符。如果在HashMap中,将该字符对应的value减1,在某一步,value小于0,说明该字符在t中出现的次数比s中多一次,显然就是新增的那个字符。

Java

public class Solution {
    public char findTheDifference(String s, String t) {
        //HashMap不能使用基本数据类型
        //Map<char,int> s_strmap = new HashMap<char,int>();
        Map<Character,Integer> s_strmap = new HashMap<Character,Integer>();
        int i;
        char result = '0';
        for(i = 0;i < s.length();i ++)
        {
            //hashmap中没有该字符,字符作为key,出现次数置1放入map
            //if(s_strmap.get(s.charAt(i)) == null)   
            if(s_strmap.containsKey(s.charAt(i)) == false)   
            {
                //放入该字符,value设置为0
                s_strmap.put(s.charAt(i),1);
            }
            else
            {
                //hashmap中存在该字符,出现次数value++
                //s_strmap.get(s.charAt(i))++;
                s_strmap.put(s.charAt(i),s_strmap.get(s.charAt(i))+1);
            }
        }
        for(i = 0;i < t.length();i ++)
        {
            //如果t中字符在HashMap中不存在,则显然是那个不同的字符
            if(s_strmap.get(t.charAt(i)) == null)
                result = t.charAt(i);

            else
            {
                //更新HashMap,将value-1
                s_strmap.put(t.charAt(i),s_strmap.get(t.charAt(i))-1);
                //判断value是否小于0,如果<0,说明重复的字符中t中多了一个
                if(s_strmap.get(t.charAt(i)) < 0)
                    result = t.charAt(i);
            }
        }
        return result;
    }
}

ps:Solutions有两种更好的思路,根据s和t中只有一个字母不同,用位运算或者ASCII码解决,记下以供学习

ASCII码
public char findTheDifference(String s, String t) {
        int charCode = t.charAt(s.length());
        // Iterate through both strings and char codes
        for (int i = 0; i < s.length(); ++i) {
              charCode -= (int)s.charAt(i);
              charCode += (int)t.charAt(i); 
        }
        return (char)charCode;
        //结果转为char返回
    }
bit manipulation
public char findTheDifference(String s, String t) {
    int n = t.length();
    char c = t.charAt(n - 1);
    for (int i = 0; i < n - 1; ++i) {
        c ^= s.charAt(i);
        c ^= t.charAt(i);
    }
    return c;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值