摘要:是按位或二進(jìn)制編碼中,每一位兩者其中一個(gè)為,則為,否則,則為,因此就是對(duì)每一個(gè)字符合并,例如是,是,也是,是,是。
原題目:
給定一個(gè)字符串?dāng)?shù)組,找到長度的最大值length(word[i]) * length(word[j]),其中兩個(gè)單詞中的字母無相同。您可以假定每個(gè)單詞只包含小寫字母。如果沒有這兩個(gè)詞,返回0。
例:
Input: ["abcw","baz","foo","bar","xtfn","abcdef"] Output: 16 Explanation: The two words can be "abcw", "xtfn".
解析:
這題肯定要進(jìn)行交叉對(duì)比(2個(gè)for循環(huán)),但最關(guān)鍵的就是對(duì)比過程,也就是判斷2個(gè)字符串是否存在相同的字符。
如果使用indexOf或者數(shù)組下標(biāo)記錄都會(huì)造成時(shí)間復(fù)雜度大幅提升,看了他人的答案發(fā)現(xiàn)使用的是位操作符<<,|和&,而且是在交叉對(duì)比之前進(jìn)行預(yù)處理,交叉對(duì)比的時(shí)候只需要簡單的判斷pretreate[i] & pretreate[j]===0便可,
因?yàn)槭褂煤笮侍嵘啵馕霾⑶矣涗浺幌隆?/p>
先解釋val |= (1 << (word.charCodeAt(i)-aCode)):
word.charCodeAt(i)-aCode這個(gè)很好懂,也就是a對(duì)應(yīng)0,b對(duì)應(yīng)1...這里的0,1數(shù)字代表的是
二進(jìn)制1后面的位數(shù)。
1<<0,1<<1是什么呢?
1在二進(jìn)制中(32位)就是00000000000000000000000000000001,<<是左移1位,
那么1<<0還是1,1<<1就是(前面的零省略)10,1<<2就是100,1<<3就是1000,
于是可知
a就是1,
b是10,
c是100...
z是10000000000000000000000000(25個(gè)0)。
|是按位或:二進(jìn)制編碼中,每一位兩者其中一個(gè)為1,則為1,否則,則為0,
因此 val |=就是對(duì)每一個(gè)字符合并,例如
ab 是 00010|00001=>00011,
f 是 100000,
ffff 也是 100000,
big是 101000010,
axdg是100000000000000001001001。
&,按位與,二進(jìn)制編碼中,每一位兩者都為1,則為1,否則,則為0,
例1:axdg和oigd要判斷是否有重復(fù):
axdg是:100000000000000001001001 oifd是: 100000100101000 & 后: 000000000000000000001000
因?yàn)榈?位都為1,所以最后不為0,也可得知重復(fù)的就是字母表第4位:d。
?
例2:axdg和lkmk要判斷是否有重復(fù):
結(jié)果為0,說明無重復(fù)。
axdg是:100000000000000001001001 lkmk是: 1110000000000 & 后: 000000000000000000000000
總結(jié):這種方法使用了二進(jìn)制數(shù)字的位數(shù)作為保存字符的手段,相比起數(shù)組,散列表等,速度更快,在保存量較小(<=32)優(yōu)勢(shì)非常明顯。
代碼:
/** * @param {string[]} words * @return {number} */ var maxProduct = function(words) { let aCode="a".charCodeAt(0) function compute(word){ let val=0 for(let i=0;imaxSum && (pretreatment[i] & pretreatment[j])===0){ maxSum=len1*len2 } } } return maxSum };
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97479.html
摘要:解決方案異或操作異或運(yùn)算是對(duì)于二進(jìn)制數(shù)字而言的,比如說一個(gè)有兩個(gè)二進(jìn)制,如果兩個(gè)值不相同,則異或結(jié)果為。比如說,本質(zhì)上其實(shí)是和的每一對(duì)比特位執(zhí)行異或操作,等價(jià)于下面數(shù)字對(duì)應(yīng)的二進(jìn)制數(shù)字對(duì)應(yīng)的二進(jìn)制數(shù)字對(duì)應(yīng)的二進(jìn)制因此的結(jié)果就為啦。 新年第一篇文章,先祝大家新年快樂!!那么接下來進(jìn)入正文。 前言 前陣子突發(fā)奇想,突然開始刷leetcode。其中刷到了一道有意思的題目,發(fā)現(xiàn)這道題是當(dāng)時(shí)秋招...
摘要:位算法的效率有多快我就不說,不信你可以去用億個(gè)數(shù)據(jù)模擬一下,今天給大家講一講位運(yùn)算的一些經(jīng)典例子。不過,最重要的不是看懂了這些例子就好,而是要在以后多去運(yùn)用位運(yùn)算這些技巧,當(dāng)然,采用位運(yùn)算,也是可以裝逼的,不信,你往下看。位算法的效率有多快我就不說,不信你可以去用 10 億個(gè)數(shù)據(jù)模擬一下,今天給大家講一講位運(yùn)算的一些經(jīng)典例子。不過,最重要的不是看懂了這些例子就好,而是要在以后多去運(yùn)用位運(yùn)算這...
摘要:二進(jìn)制本身就是為這個(gè)數(shù)字而使用的,所以說這道面試題直指二進(jìn)制的使用是沒錯(cuò)的。正負(fù)在二進(jìn)制中,第一位為的是負(fù)數(shù),是正數(shù)。 showImg(https://segmentfault.com/img/bVbd7d0?w=1580&h=732); 前言 使用PHP,給定一個(gè)數(shù),判斷這個(gè)數(shù)是否是二的N次方 這樣看似簡單的一個(gè)面試題, 實(shí)際牽出了很多基礎(chǔ)知識(shí),本章在為大家補(bǔ)習(xí)基礎(chǔ)知識(shí)的情況下來解答...
摘要:使用位運(yùn)算數(shù)組只出現(xiàn)一次數(shù)字的數(shù)組得到最低的有效位,即兩個(gè)數(shù)不同的那一位看完上面的解法,我腦海中只有問號(hào)的存在,啥意思啊下面就讓我們簡單了解一下位運(yùn)算并解析一下這三道題目。另,負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算。你可做過這幾道題? 在面試的準(zhǔn)備過程中,刷算法題算是必修課,當(dāng)然我也不例外。某天,我刷到了一道神奇的題目: # 136. 只出現(xiàn)一次的數(shù)字 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外...
摘要:簡單介紹一下位運(yùn)算異或運(yùn)算異或邏輯的關(guān)系是當(dāng)不同時(shí),輸出當(dāng)相同時(shí),輸出。另,負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算。使一個(gè)數(shù)的最低位為零,可以表示為。,截止到這兒,三道題目中使用的位運(yùn)算介紹完畢,那么這里我們插入一下的詳細(xì)題解。你可做過這幾道題? 在面試的準(zhǔn)備過程中,刷算法題算是必修課,當(dāng)然我也不例外。某天,我刷到了一道神奇的題目: # 136. 只出現(xiàn)一次的數(shù)字 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只...
閱讀 3045·2021-09-22 14:59
閱讀 1878·2021-09-22 10:02
閱讀 2115·2021-09-04 16:48
閱讀 2265·2019-08-30 15:53
閱讀 2971·2019-08-30 11:27
閱讀 3410·2019-08-29 18:35
閱讀 966·2019-08-29 17:07
閱讀 2676·2019-08-29 13:27