刷穿劍指offer-Day02-整數(shù)II

昨日回顧

昨天作為這個系列的第一篇文章痹升,分別介紹了Java與Python的以下內(nèi)容:

  1. 整數(shù)類型與考點
  2. 二進制與十進制的轉(zhuǎn)換
  3. 與了袁、或贷屎、異或的操作
  4. 位移操作

以上內(nèi)容舀奶,如果遺忘了,一定要定時復(fù)習(xí)啊...今天是整數(shù)的第二篇文章仗扬,會和大家稍有跳躍分享一道簡單題+一道中等題目症概,用來對二進制算法完成進一步的鞏固。

每道題涉及的知識點會在題目分析中給出整理早芭。讓我們開始吧彼城!

劍指OfferII002.二進制加法

https://leetcode-cn.com/problems/JFETK5/solution/shua-chuan-jian-zhi-offer-day02-zheng-sh-obx6/

難度:簡單

題目

給定兩個 01 字符串 a 和 b ,請計算它們的和退个,并以二進制字符串的形式輸出募壕。
輸入為 非空 字符串且只包含數(shù)字 1 和 0。

提示:

  • 每個字符串僅由字符 '0' 或 '1' 組成帜乞。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 "0" 司抱,就都不含前導(dǎo)零。

示例

示例 1:
輸入: a = "11", b = "10"
輸出: "101"

示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"

分析

正如昨天提到的黎烈,在做整數(shù)題目時习柠,Python與Java的差別是什么呢匀谣?

  • Python: 放心大膽無腦沖!
  • Java:在越界的邊緣戰(zhàn)戰(zhàn)兢兢资溃。

所以很多時候Python在刷題上簡直是作弊武翎,拿這道題來說,a溶锭、b的長度都為10 ^ 4宝恶,
在Java中是沒辦法表示的,對于Python只需要一行趴捅,簡直了:

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        return bin(int(a, 2) + int(b, 2))[2:]

可如果在面試中這樣寫垫毙,那真是一首涼涼送給你。 但這畢竟是一道簡單題目拱绑,作為今天的開胃菜综芥,并沒有太大的難度。

對于這道題猎拨,我們只需要牢記以下三點即可:

  1. 逢二進一是二進制的法則
  2. 進位的這個一膀藐,我們需要找個變量才存儲它,才能在下一次的循環(huán)中獲取
  3. 對于不等長的字符串红省,我們需要進行適當?shù)膬?yōu)化與判斷

解題

Python

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        ret, count = '', 0
        i, j = len(a) - 1, len(b) - 1
        while i >= 0 or j >= 0 or count:
            if i >= 0:
                count += ord(a[i]) - ord('0')
            if j >= 0:
                count += ord(b[j]) - ord('0')
            ret += str(count % 2)
            count //= 2
            i, j = i - 1, j - 1
        return ret[::-1]

Java

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder ret = new StringBuilder();
        int count = 0;
        for (int i = a.length() - 1, j = b.length() - 1;
             i >= 0 || j >= 0 || count > 0; i--, j--) {
            int total = count;
            total += i >= 0 ? a.charAt(i) - '0' : 0;
            total += j >= 0 ? b.charAt(j) - '0' : 0;
            count = total > 1 ? 1 : 0;
            ret.append(total - count * 2);
        }
        return ret.reverse().toString();
    }
}

作為開胃菜的第一道題额各,就到這里,如此的難度吧恃,能否喚起你重拳出擊的氣勢虾啦,那么繼續(xù)看下一道題吧!

劍指OfferII004.只出現(xiàn)一次的數(shù)字

https://leetcode-cn.com/problems/WGki4K/solution/shua-chuan-jian-zhi-offer-day02-zheng-sh-tlce/

難度:中等

題目

給你一個整數(shù)數(shù)組 nums 蚜枢,除某個元素僅出現(xiàn) 一次 外缸逃,其余每個元素都恰出現(xiàn) 三次 针饥。
請你找出并返回那個只出現(xiàn)了一次的元素厂抽。

提示:

  • 1 <= nums.length <= 3 * 10 ^ 4
  • -2 ^ 31 <= nums[i] <= 2 ^ 31 - 1
  • nums 中,除某個元素僅出現(xiàn) 一次 外丁眼,其余每個元素都恰出現(xiàn) 三次

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

示例

示例 1:
輸入:nums = [2,2,3,2]
輸出:3

示例 2:
輸入:nums = [0,1,0,1,0,1,100]
輸出:100

分析

如果考慮進階中說到的不使用額外空間苞七,那這道題真的是一道很簡單的題目了藐守。我們可以通過以下兩種方法實現(xiàn):

  • 哈希表

    1. 創(chuàng)建一個哈希表
    2. 循環(huán)數(shù)組,將每個元素挨個加入哈希表中
    3. 遍歷哈希表中的數(shù)據(jù)蹂风,查找哪個數(shù)字只出現(xiàn)了一次返回卢厂。
  • 集合+數(shù)學(xué)

    1. 既然數(shù)組中只有一個數(shù)出現(xiàn)1次,其他的都出現(xiàn)三次惠啄,那么我們先創(chuàng)建一個集合
    2. 將數(shù)組加入集合s中慎恒,保持每個數(shù)字的唯一性
    3. 然后分別求sum(nums)任内、sum(s)
    4. 將sum(s) * 3 - sum(nums)會得到什么結(jié)果,是否為多那個只出現(xiàn)一次數(shù)字所缺失的兩倍數(shù)字
    5. 然后將上一步的結(jié)果除以2融柬,就得到了最終的結(jié)果死嗦。

以上兩種方式,均可以計算出結(jié)果粒氧,但是都因為開辟了額外空間而不滿足進階的要求越除。那么,進階該如何操作呢外盯?
這里先簡單介紹下力扣136題摘盆,只出現(xiàn)一次的數(shù)字。

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

遇到這道題同樣上面的兩個方法可以使用肋殴,但通過昨天的學(xué)習(xí),我們應(yīng)該第一時間想到異或操作坦弟,相同的二進制異或為0护锤。
那么將數(shù)組挨個異或后的結(jié)果,不就是那個數(shù)字了么酿傍?

理解了這個思路烙懦,再看當前這道題目。這里我們有三個相同的數(shù)字赤炒,沒辦法通過異或操作完成判斷氯析,那如何換一種思路實現(xiàn)呢?
讓我們看看下面這張圖吧:

如果我們可以將所有的數(shù)字都轉(zhuǎn)化為二進制莺褒,然后根據(jù)每一位對3其余掩缓,最終不就是我們要的結(jié)果嗎?
最方便的是我們創(chuàng)建一個32位長度的數(shù)組遵岩,然后針對每個數(shù)字的二進制位對該數(shù)組對應(yīng)下標進行累加你辣,最終計算結(jié)果。
這里存在一個空間復(fù)雜度的計算規(guī)則尘执,跟時間復(fù)雜度類似舍哄,如果是常數(shù)的空間申請,是可以忽略為O(1)的誊锭。
但為了嚴格按照題目要求表悬,我們通過左位移配合二進制加法來實現(xiàn)累加操作,具體如圖:

  1. 初始ret = 0
  2. 循環(huán)32位二進制位數(shù)i
  3. 計算循環(huán)數(shù)組該i位之和對3求余
  4. 若余數(shù)為1丧靡,則 ret |= 1 << i即可
  5. 最終返回ret即可

這里要注意下由于Python是無符號位的二進制蟆沫,所以需要對最高位進行判斷叉讥。
若為1則表示負數(shù),需要對ret進行減等操作饥追。

解題

Python

class Solution:
    def singleNumber(self, nums) -> int:
        ret = 0
        for i in range(32):
            cnt = 0
            for num in nums:
                cnt += num >> i & 1
            if cnt % 3:
                if i == 31:
                    ret -= (1 << i)
                else:
                    ret |= 1 << i
        return ret

Java

class Solution {
    public int singleNumber(int[] nums) {
        int ret = 0;
        for (int i = 0; i < 32; i++) {
            int cnt = 0;
            for (int num : nums) {
                cnt += num >> i & 1;
            }
            if (cnt % 3 != 0) {
                ret |= 1 << i;
            }
        }
        return ret;
    }
}

歡迎關(guān)注我的公眾號: 清風(fēng)Python图仓,帶你每日學(xué)習(xí)Python算法刷題的同時,了解更多python小知識但绕。

我的個人博客:https://qingfengpython.cn

力扣解題合集:https://github.com/BreezePython/AlgorithmMarkdown

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末救崔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捏顺,更是在濱河造成了極大的恐慌六孵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅骄,死亡現(xiàn)場離奇詭異劫窒,居然都是意外死亡,警方通過查閱死者的電腦和手機拆座,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門主巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挪凑,你說我怎么就攤上這事孕索。” “怎么了躏碳?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵搞旭,是天一觀的道長。 經(jīng)常有香客問我菇绵,道長肄渗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任咬最,我火速辦了婚禮翎嫡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丹诀。我一直安慰自己钝的,他們只是感情好翁垂,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布铆遭。 她就那樣靜靜地躺著,像睡著了一般沿猜。 火紅的嫁衣襯著肌膚如雪枚荣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天啼肩,我揣著相機與錄音橄妆,去河邊找鬼衙伶。 笑死,一個胖子當著我的面吹牛害碾,可吹牛的內(nèi)容都是我干的矢劲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慌随,長吁一口氣:“原來是場噩夢啊……” “哼芬沉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁猜,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丸逸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剃袍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黄刚,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年民效,在試婚紗的時候發(fā)現(xiàn)自己被綠了憔维。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡畏邢,死狀恐怖埋同,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棵红,我是刑警寧澤凶赁,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站逆甜,受9級特大地震影響虱肄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜交煞,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一咏窿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧素征,春花似錦集嵌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至端蛆,卻和暖如春凤粗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背今豆。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工嫌拣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柔袁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓异逐,卻偏偏與公主長得像捶索,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灰瞻,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容