Leetcode刷题笔记之 位运算

389. 找不同

给定两个字符串 st,它们只包含小写字母。

字符串 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值