成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一道有意思的面試算法題

maxmin / 2716人閱讀

摘要:解決方案異或操作異或運(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í)秋招的時(shí)候,騰訊面試官曾經(jīng)問過我的題目。于是分享給大家看下。

題目描述

給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。

初步解法

這道題第一眼看過去,思路挺簡(jiǎn)單的,我們只需要維護(hù)一個(gè)對(duì)象來記錄每一個(gè)元素出現(xiàn)的次數(shù),使用元素的值作為key,元素出現(xiàn)的次數(shù)作為value。之后再遍歷這個(gè)對(duì)象,找到value為1的key。對(duì)應(yīng)的key就是那個(gè)元素。代碼如下:

function singleNumber(nums) {
  const obj = {};
  for (let i = 0; i < nums.length; i++) {
    obj[nums[i]] = obj[nums[i]] ? obj[nums[i]] + 1 : 1;
  }
  for (let key in obj) {
    if (obj[key] === 1) {
      return Number(key); // 由于 key 是 string ,因此我們這里需要轉(zhuǎn)化下
    }
  }
}

console.log(singleNumber([2, 2, 1, 4, 4, 5, 5, 1, 8])); // 8
增加限制

是吧,這道題很簡(jiǎn)單,那我為什么要說它有意思呢?
因?yàn)轭}目里面其實(shí)還有一個(gè)限制:

你的算法應(yīng)該具有線性時(shí)間復(fù)雜度。 你可以不使用額外空間來實(shí)現(xiàn)嗎?

重點(diǎn)在于不使用額外空間。我們上面那種解法,創(chuàng)建了一個(gè)新的對(duì)象來儲(chǔ)存結(jié)果,明顯是不行的。那么有沒有辦法可以只使用原來的數(shù)組來實(shí)現(xiàn)這個(gè)功能呢?

最終解法

我們可以思考下,一個(gè)數(shù)組里,所有的數(shù)字都出現(xiàn)兩次,除了一個(gè)我們要找的數(shù)字只出現(xiàn)一次。那么,我們有沒有辦法將兩個(gè)相同的數(shù)字給過濾掉呢?

好啦,不賣關(guān)子了,之前有了解過的人應(yīng)該就知道解決方案了,如果之前沒了解過這方面東西的人,可以繼續(xù)往下看。

解決方案:異或操作

異或運(yùn)算是對(duì)于二進(jìn)制數(shù)字而言的,比如說一個(gè)有兩個(gè)二進(jìn)制a、b,如果a、b兩個(gè)值不相同,則異或結(jié)果為1。如果a、b兩個(gè)值相同,異或結(jié)果為0。

而javascript的按位異或(即^操作)操作,則會(huì)對(duì)兩個(gè)數(shù)字相應(yīng)的每一對(duì)比特位執(zhí)行異或操作。

比如說 1 ^ 2,本質(zhì)上其實(shí)是1和2的每一對(duì)比特位執(zhí)行異或操作,等價(jià)于下面

  00000000000000000000000000000001 // 數(shù)字1對(duì)應(yīng)的二進(jìn)制
^ 00000000000000000000000000000010 // 數(shù)字2對(duì)應(yīng)的二進(jìn)制
= 00000000000000000000000000000011 // 數(shù)字3對(duì)應(yīng)的二進(jìn)制

因此1^2的結(jié)果就為3啦。

那么如果兩個(gè)相同的數(shù)字進(jìn)行異或操作,結(jié)果就可想而知,答案為0啦。

如果是0和任何一個(gè)數(shù)字異或呢?結(jié)果是數(shù)字本身。

我們舉個(gè)栗子:
假設(shè)我們有一個(gè)數(shù)組,里面元素為[a, a, c, c, b, b, d]。那么我們對(duì)數(shù)組里的所有元素進(jìn)行按位異或操作,即a ^ a ^ c ^ c ^ b ^ b ^ d,是不是就等價(jià)于0 ^ 0 ^ 0 ^ d = d。而d就是數(shù)組里只出現(xiàn)一次的元素。
那么我們可以擴(kuò)展一下,對(duì)于任意滿足某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次的數(shù)組,是不是可以通過這種方式來得到那個(gè)只出現(xiàn)一次的元素。

這樣一來的話,我們是不是有了這個(gè)問題的解決辦法了?我們只需要遍歷數(shù)組,將所有的值取異或,最終剩下的值,就是那個(gè)只出現(xiàn)一次的數(shù)字。代碼如下:

/**
 * 只存在一次的數(shù)字
 * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/25/
 * @param {number[]} nums
 * @return {number}
 */
function singleNumber(nums) {
  for (let i = 1; i < nums.length; i++) {
    nums[0] ^= nums[i];
  }
  return nums[0];
};

console.log(singleNumber([2, 2, 1, 4, 4, 5, 5, 1, 8]));
結(jié)語(yǔ)

這道面試題主要考驗(yàn)面試者對(duì)異或的理解,以及能不能活學(xué)活用,將這道題與異或聯(lián)系在一起。當(dāng)然,最重要的還是多學(xué)習(xí)、多刷題、多看書。這樣才能不斷進(jìn)步。

本文地址在->本人博客地址, 歡迎給個(gè) start 或 follow

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100669.html

相關(guān)文章

  • 一道前端面試談起

    摘要:但是題目非要弄成鏈表的形式,說實(shí)在的,我真沒有見過前端什么地方還需要用鏈表這種結(jié)構(gòu)的除了面試的時(shí)候,所以說這種題目對(duì)于實(shí)際工作是沒什么用處的,但是腦筋急轉(zhuǎn)彎的智商題既然這樣出了,我們就來看看怎么解決它吧。 今天在知乎上看到一個(gè)回答《為什么前端工程師那么難招?》,作者提到說有很多前端工程師甚至連單鏈表翻轉(zhuǎn)都寫不出來。說實(shí)話,來面試的孩子們本來就緊張,你要冷不丁問一句單鏈表翻轉(zhuǎn)怎么寫,估計(jì)...

    darkbaby123 評(píng)論0 收藏0
  • 一道多線程面試引起自我救贖

    摘要:重溫一個(gè)面試題內(nèi)容數(shù)組內(nèi)容為數(shù)組內(nèi)容為個(gè)英文字母,使用兩個(gè)線程分別輸入兩個(gè)數(shù)組,打印內(nèi)容為這樣的規(guī)律提取一下核心內(nèi)容,去除次要內(nèi)容兩個(gè)線程需要交替執(zhí)行,打印數(shù)字的線程需要先執(zhí)行,數(shù)組打印完畢后線程需要結(jié)束。 一道多線程面試題引起的自我救贖 近日去一個(gè)知名互聯(lián)網(wǎng)企業(yè)參加面試,之前準(zhǔn)備多多信心滿滿,但是面試一開始就是一道不起眼的編程題 數(shù)組A內(nèi)容為 1,2,3,4...52 ,數(shù)組B內(nèi)容...

    BaronZhang 評(píng)論0 收藏0
  • 前端面試一道算法(使用canvas解答)

    摘要:據(jù)了解,現(xiàn)在前端面試也喜歡考算法題了。下面說一個(gè)跟前端有點(diǎn)相關(guān)并且有點(diǎn)趣的一道算法題。遍歷二維數(shù)組連續(xù)的個(gè)數(shù)連續(xù)的個(gè)數(shù)形狀的總數(shù)第幾個(gè)形狀形狀的面積最后的代碼圖片路徑讀取整張圖片的像素。 據(jù)了解,現(xiàn)在前端面試也喜歡考算法題了。前幾天去面試,果不其然的,面試官給我四道算法題,讓我自己回去做。下面說一個(gè)跟前端有點(diǎn)相關(guān)并且有點(diǎn)趣的一道算法題。 題目: 平面上有若干個(gè)不特定的形狀,如下圖所示...

    hot_pot_Leo 評(píng)論0 收藏0
  • 從簡(jiǎn)歷被拒到收割今日頭條 offer,我用一年時(shí)間破繭成蝶!

    摘要:正如我標(biāo)題所說,簡(jiǎn)歷被拒??戳宋液?jiǎn)歷之后說頭條競(jìng)爭(zhēng)激烈,我背景不夠,點(diǎn)到為止。。三準(zhǔn)備面試其實(shí)從三月份投遞簡(jiǎn)歷開始準(zhǔn)備面試到四月份收,也不過個(gè)月的時(shí)間,但這都是建立在我過去一年的積累啊。 本文是 無(wú)精瘋 同學(xué)投稿的面試經(jīng)歷 關(guān)注微信公眾號(hào):進(jìn)擊的java程序員K,即可獲取最新BAT面試資料一份 在此感謝 無(wú)精瘋 同學(xué)的分享 目錄: 印象中的頭條 面試背景 準(zhǔn)備面試 ...

    tracymac7 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<