389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入: s = "abcd" t = "abcde" 输出: e 解释: 'e' 是那个被添加的字母。
异或:
- 两个相同元素异或之后的值是0,
- 0和x(任何数)异或等于x,
- 不管两个相同的数是在什么时候异或的,最终的结果都会存在0
假如有6个数字:2 3 4 4 3 2, 不管是2^3^4^4^3^2 还是我们经过处理之后组合起来(2^2)^(3^3)^(4^4)结果都是一样的,不会影响结果
那我们想下本题两个字符串中的字符,s和t中相同的字符都存在两个,将他们全部异或之后肯定为0,然后其中还有一个多出来的就成了0^x=x,从而得到结果,不知道大家理解没
class Solution {
public char findTheDifference(String s, String t) {
char result = 0;
for (int i = 0; i < s.length(); i++){
result ^= s.charAt(i);
}
for (int i = 0; i < t.length(); i++){
result ^= t.charAt(i);
} return result;
}
通过维护一个大小为26的数组,在数组中记录每个字符出现的次数,然后遍历t减去相应的元素个数,如果出现-1的情况说明s字符串中不存在的字符
public char findTheDifference1(String s, String t) {
int[] record = new int[26];
int lenS = s.length();
int lenT = t.length();
for (int i = 0; i < lenS; i++){
record[s.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < lenT; i++){
record[t.charAt(i) - 'a'] -= 1;
if (record[t.charAt(i) - 'a'] < 0) return t.charAt(i);
}
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
class Solution {
public int singleNumber(int[] nums) {
int result =0;
for(int i=0;i<nums.length;i++){
result ^= nums[i];
}
return result;
}
}
318. 最大单词长度乘积
难度中等95
给定一个字符串数组
words
,找到length(word[i]) * length(word[j])
的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。示例 1:
输入: ["abcw","baz","foo","bar","xtfn","abcdef"] 输出: 16 解释: 这两个单词为 "abcw", "xtfn"。
示例 2:
输入: ["a","ab","abc","d","cd","bcd","abcd"] 输出: 4 解释: 这两个单词为 "ab", "cd"。
示例 3:
输入: ["a","aa","aaa","aaaa"] 输出: 0 解释: 不存在这样的两个单词。
用二进制的一位表示某一个字母是否出现过,0表示没出现,1表示出现。
"abcd"二进制表示00000000 00000000 00000000 00001111
"bc"二进制表示00000000 00000000 00000000 00000110
hash[i]的表示如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLzW5Otm-1627553670118)(位运算.assets/image-20200718222209885.png)]
当两个字符串没有相同的字母时,二进制数与的结果为0。
class Solution {
public int maxProduct(String[] words) {
int wordsLength[] = new int[words.length];//存字符串长度
long[] bitArr = new long[words.length];//存字符串的二进制表示
//计算字符串的二进制表示
for (int i = 0; i < words.length; i++) {
wordsLength[i] = words[i].length();
for (int p = 0; p < words[i].length(); p++) {
bitArr[i] |= 1 << words[i].charAt(p) - 'a';
}
}
int max = 0;
//两两计算是否有相同字母,没有相同字母则计算乘积
for (int i = 0; i < words.length; i++) {
for (int j = i + 1; j < words.length; j++) {
long res = bitArr[i] & bitArr[j];
if(res == 0){
max = wordsLength[i]*wordsLength[j