<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)136:只出現(xiàn)一次的數(shù)字

          共 2718字,需瀏覽 6分鐘

           ·

          2020-12-30 17:05

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做只出現(xiàn)一次的數(shù)字,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/single-number/

          Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.


          Follow up: Could you implement a solution with a linear runtime complexity and without using extra memory?

          題意


          給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。
          說(shuō)明:
          你的算法應(yīng)該具有線性時(shí)間復(fù)雜度。 你可以不使用額外空間來(lái)實(shí)現(xiàn)嗎?


          樣例

          示例 1:

          輸入: [2,2,1]
          輸出: 1

          示例 2:

          輸入: [4,1,2,1,2]
          輸出: 4


          解題

          https://www.cnblogs.com/zfLee/p/9330127.html

          先找出題目中的重點(diǎn)要求:
            1、線性時(shí)間復(fù)雜度:要求我們的代碼時(shí)間復(fù)雜度最高為O(n),不能有嵌套循環(huán)等。
            2、不使用額外空間:要求空間復(fù)雜度最高為O(1)。
          除此之外,還有重要的信息:
          除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。
            這個(gè)條件非常關(guān)鍵,一開(kāi)始自己審題不清楚沒(méi)注意到均出現(xiàn)兩次這個(gè)關(guān)鍵點(diǎn),按照其他元素出現(xiàn)多次的情況處理了,這樣導(dǎo)致思路受限很多。

          開(kāi)始解題:

          方法一(比較法):
            思路:先對(duì)數(shù)組進(jìn)行排序,然后對(duì) nums[i] 和 nums[i + 1]進(jìn)行比較,如相等,i += 2,繼續(xù)下一組比較,直到取到不相等的一組。
            注意:首先這個(gè)數(shù)組的長(zhǎng)度肯定是奇數(shù)(目標(biāo)數(shù)字只出現(xiàn)一次,其他所有數(shù)字出現(xiàn)兩次),所以如果上述步驟沒(méi)有找到不相等的一組數(shù),那么肯定是數(shù)組的最后一個(gè)數(shù)字是單獨(dú)出現(xiàn)的。
          public?static?int?singleNumber(int[] nums)?{
          ????????int?num = 0;
          ????????for?(int?i = 0; i < nums.length; i++) {
          ????????????num = num ^ nums[i];
          ????????}
          ????????return?num;
          ????}
          ?
          方法二(去重法):
            思路:利用HashSet的特性,刪除重復(fù)的數(shù)組元素,最后剩下一個(gè)單獨(dú)的元素,返回即可。

          public?static?int?singleNumber(int[] nums) {
          ????????Set set?= new?HashSet<>();
          ????????for?(int?i = 0; i < nums.length; i++) {
          ????????????if?(!set.add(nums[i])) { // add成功返回true,如果set中已有相同數(shù)字,則add方法會(huì)返回false
          ????????????????set.remove(nums[i]); // 刪除重復(fù)出現(xiàn)的數(shù)字
          ????????????}
          ????????}
          ????????return?set.iterator().next(); }

          方法三(求差法):
            思路:先對(duì)數(shù)組排序,顯而易見(jiàn)的,單獨(dú)出現(xiàn)一次的數(shù)據(jù)必然是出現(xiàn)在數(shù)組下標(biāo)為偶數(shù)的位置(下標(biāo)從0開(kāi)始),那么所有奇數(shù)下標(biāo)的元素之和減去偶數(shù)下標(biāo)的元素之和,就是需要求得的結(jié)果。
            代碼如下:
          public?static?int?singleNumber(int[] nums)?{
          ????????int?num = 0;
          ????????Arrays.sort(nums);
          ????????for?(int?i = 0; i < nums.length; i++) {
          ????????????// 偶數(shù)下標(biāo)位置 num += nums[i],奇數(shù)下標(biāo)位置 num -= nums[i]
          ????????????num = i % 2?== 0?? num + nums[i] : num - nums[i];
          ????????}
          ????????return?num;
          ????}

          方法四(異或法)
            思路:根據(jù)異或運(yùn)算的特點(diǎn),相同的數(shù)字經(jīng)過(guò)異或運(yùn)算后結(jié)果為0,除單獨(dú)出現(xiàn)一次的數(shù)字外,其他數(shù)字都是出現(xiàn)兩次的,那么這些數(shù)字經(jīng)過(guò)異或運(yùn)算后結(jié)果一定是0。而任何數(shù)字與0進(jìn)行異或運(yùn)算都是該數(shù)字本身。所以對(duì)數(shù)組所有元素進(jìn)行異或運(yùn)算,運(yùn)算結(jié)果就是題目的答案。
            上代碼:
          public?static?int?singleNumber(int[] nums)?{
          ????????int?num = 0;
          ????????for?(int?i = 0; i < nums.length; i++) {
          ????????????num = num ^ nums[i];
          ????????}
          ????????return?num;
          ????}


          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。

          上期推文:

          LeetCode1-120題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)121:買(mǎi)賣股票的最佳時(shí)機(jī)
          LeetCode刷題實(shí)戰(zhàn)122:買(mǎi)賣股票的最佳時(shí)機(jī) II
          LeetCode刷題實(shí)戰(zhàn)123:買(mǎi)賣股票的最佳時(shí)機(jī) III
          LeetCode刷題實(shí)戰(zhàn)124:二叉樹(shù)中的最大路徑和
          LeetCode刷題實(shí)戰(zhàn)125:驗(yàn)證回文串
          LeetCode刷題實(shí)戰(zhàn)126:?jiǎn)卧~接龍 II
          LeetCode刷題實(shí)戰(zhàn)127:?jiǎn)卧~接龍
          LeetCode刷題實(shí)戰(zhàn)128:最長(zhǎng)連續(xù)序列
          LeetCode刷題實(shí)戰(zhàn)129:求根到葉子節(jié)點(diǎn)數(shù)字之和
          LeetCode刷題實(shí)戰(zhàn)130:被圍繞的區(qū)域
          LeetCode刷題實(shí)戰(zhàn)131:分割回文串
          LeetCode刷題實(shí)戰(zhàn)132:分割回文串 II
          LeetCode刷題實(shí)戰(zhàn)133:克隆圖
          LeetCode刷題實(shí)戰(zhàn)134:加油站
          LeetCode刷題實(shí)戰(zhàn)135:分發(fā)糖果


          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲成人无码在线 | 簧片在线观看视频 | 99自拍视频 | 中文字幕乱码人妻二区三区 | 欧美后门菊门交 |