11月17日 力扣每日一题:最大单词长度乘积 318

if(cnti[p]>=1 && cntj[p]>=1)

flag = 1;

}

if(flag == 0)

{

int leni = words[i].length();

int lenj = words[j].length();

// curlen= words[i].length() * words[j].length();

curlen = leni * lenj ;

}

lenMax = lenMax > curlen ? lenMax : curlen;

}

}

return lenMax;

}

}

在力扣答题环境中超时,IDEA中题目给的样例都能过,大致应该没啥问题

就是超时~


二、三叶姐的每日一题题解(未优化)

=================

力扣

其中核心代码的分析和测试:

今天又学会了很多

三、总结如下:


1:位掩码

题目给出的 每个字符串的组成都是小写字母,这个信息要用到

然后核心代码的思想,先求其是26个小写字母中第几个字母

然后向左移位,之后或运算存储,把操作复杂度降低为O(N^2) YYDS了

我还以为是放入长度26数组~

位掩码这个知识点属实是给我这个土狗长见识了!

二、或运算(“ | ”)的底层操作:

{

{

int j = 31;

// 31 = 1+2+4+8+16

// 用01 二进制表示  0001 1111

System.out.println(j | 1);//与末尾1 或

System.out.println(j | 2);//表示为0000  0010  与倒数第二个1

System.out.println(j | 4);

System.out.println(j | 8);

System.out.println(j | 16);

//        System.out.println(j | 16);

// 1或1 还是 1 , 1或0,必定0

//只有原来是 0 的位 你或进位为1的 ,才能输出

//        比如31或一个32 结果肯定是 63 ,给出一种相加的假象,最终底层是一二进制01码逐位或的

System.out.println(31 | 32);

}

}

{

{

int j = 31;

// 31 = 1+2+4+8+16

// 用01 二进制表示 0001 1111

System.out.println(j | 1);//与末尾1 或

System.out.println(j | 2);//表示为0000 0010 与倒数第二个1

System.out.println(j | 4);

System.out.println(j | 8);

System.out.println(j | 16);

// System.out.println(j | 16);

// 1或1 还是 1 , 1或0,必定0

//只有原来是 0 的位 你或进位为1的 ,才能输出

// 比如31或一个32 结果肯定是 63 ,给出一种相加的假象,最终底层是一二进制01码逐位或的

System.out.println(31 | 32);

}

}

public class AAAATest

{

public static void main(String[] args)

{

// String[] words = {“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”};

String[] words = {“a”,“aa”,“aaa”,“aaaa”};

int n = words.length, idx = 0;

int[] masks = new int[n];

for (String w : words) {

int t = 0;

for (int i = 0; i < w.length(); i++) {

int u = w.charAt(i) - ‘a’;

t |= (1 << u);

//此处 用 或 一句话

//妙处有3

//其一,通过不断用新元素减去‘a’得出是第几个字母,然后向左移位(乘2),然后不断地或

//此处用或 ,妙处为其二 或运算,如a对应的是0,a,一个0,aa,两个0,aaa,三个0

//但是每个字母a对移位的影响都一样

//这种或运算只统计一次,

//每次乘2,妙处,不会重复

//26个字母,最大的2的25次方 从2 到 2的25次方

//你可能会觉得一个 b 移位一位 然后乘2 变成2

//如果字符串是 bbc ,那么两个b会不会2+2等于 4抵消一个c位移两位的结果

//告诉你不会的,因为或运算对

// 2|2|4只统计一次2

}

masks[idx++] = t;

}

int j = 31;

// 31 = 1+2+4+8+16

// 用01 二进制表示 0001 1111

System.out.println(j | 1);//与末尾1 或

System.out.println(j | 2);//表示为0000 0010 与倒数第二个1

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值