GuilinDev

Lc0389

05 August 2008

389 - Find the Difference

原题概述

Given two strings s and t which consist of only lowercase letters.

String t is generated by random shuffling string s and then add one more letter at a random position.

Find the letter that was added in t.

Example:

1
2
3
4
5
6
7
8
9
Input:
s = "abcd"
t = "abcde"

Output:
e

Explanation:
'e' is the letter that was added.

题意和分析

给一个字符串s,根据s把里面的字符都shuffle一下然后随机加一个字符然后生产t,找到刚才随机加上的字符。

首先位操作的XOR可以去掉重复,因为自己和自己异或等于0;另外也可以计算两个字符串char codes的差距,然后转换成char即可,时间O(n),空间O(1)。

char b = ‘a’+18; //因为char本身在码表中可以用数字表示的,然后运算玩之后还是char,应该输出s

char a = ‘a’; //这个定义就是错误的。

char b = a + 18; // 这样也是错的,因为JVM运算完后不知道结果是多少,所以会提示损失精度的错误,关于一个类型变量值的问题。

代码

XOR

1
2
3
4
5
6
7
8
9
10
11
class Solution {
    public char findTheDifference(String s, String t) {
        int len = t.length();
        char ch = t.charAt(len - 1);//初始化,注意长字符串t最后多出来的那位为初始值,因为下面的循环要保证每个元素都遍历到
        for (int i = 0; i < len - 1; i++) {//i < len -1,短的字符串不越界
            ch ^= s.charAt(i);
            ch ^= t.charAt(i);
        }
        return ch;
    }
}

XOR更好理解的做法,需要一点额外空间,两个串合在一起然后XOR,最后剩余的就是多出来的字符

1
2
3
4
5
6
7
8
9
10
class Solution {
    public char findTheDifference(String s, String t) {
        String merge = s + t;
        char ch = 0;//初始化,这里表示ch的初始值为空格' ',P.S.,用ch != '\0'判断字符是否为空格
        for (int i = 0; i < merge.length(); i++) {
            ch ^= merge.charAt(i);//等于 ch = (char) (ch ^ merge.charAt(i));
        }
        return ch;
    }
}

int和char转换的做法

1
2
3
4
5
6
7
8
9
10
11
class Solution {
    public char findTheDifference(String s, String t) {
        int len = s.length();
        int charCode = t.charAt(len);//初始化为长的字符串最后一位,因为下面的循环要保证每个元素都遍历到
        for (int i = 0; i < len; i++) {
            charCode -= s.charAt(i);
            charCode += t.charAt(i);
        }
        return (char)charCode;
    }
}