题意
两个字符串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;
}