LeetCode進階136-位運算巧用

一些感悟

最近有個朋友問我,爲何會寫數據結構與算法相關的技術博客。有一些機緣巧合的因素,有段時間壓力很大,也正是在那段滿腦子負能量胡思亂想的日子裏的某個失眠的夜晚我看見了兩段比較雞湯的話。第一段是:你不妨大膽一些,愛一我的,攀一座山,追一個夢。第二段:有一個夜晚我燒燬了全部的記憶,今後個人夢就透明瞭;有一個早晨我扔掉了全部的昨天,今後個人腳步就輕盈了。人是個很奇怪的生物,不少簡單的道理能脫口而出可是落到本身身上卻很難實踐,有些簡單的道理可能等到明白的時候人生匆匆已過數十載。曾經看過不少文章有寫關於人這一輩子中最遺憾的事情,其中有兩個出現頻率比較高,分別是:後悔年輕時不夠努力;後悔沒有作本身想作的事情。仔細想一想有人時候確實須要作一些改變和嘗試,不管得失。你是否還記得年少的本身曾經許下的心願?有沒有爲此付出實踐哪怕一天?是否有一個地方一直很想去卻沒能去成?有沒有一我的一直很喜歡卻沒有表白過?想象一下若干年後塵歸塵,土歸土,老了回顧過往有沒有一件事只要一想起就會發自心裏的歡喜。也沒有一件事能充滿自豪的講給你子孫後代聽一聽...回到正題,老實說,寫Java數據結構與算法系列博客有很大一部分是出於興趣,另外一方面工做以來也一直想記錄輸出分享一些比較有意義的乾貨內容(由於時間關係也一直沒來得及整理,給本身的懶惰找個臺階...)。面試

爲何要學數據結構與算法

從近兩年國內諸多公司的戰略調整來看,整個國內互聯網的環境都在朝着一個比較好的方向發展,簡單來講就是精英化。愈來愈多的公司開始更加註重基礎,注重專業素質。而隨着時代進步和發展,精英化也必然是大勢所趨。工做以來,有一個深入的體會就是不少從事互聯網行業技術相關的開發人員大部分在計算機相關編程基礎知識方面都極度欠缺。最明顯的表現就在於數據結構與算法相關,不少不少工做多年的開發甚至不具有基礎的算法知識,這其實是一件細思恐極的事情。這會影響到什麼?最典型是沒有算法思惟和意識,沒有對項目精益求精的追求。且不談在複雜項目核心業務的設計,亦不談性能優化層面,最簡單的表如今當下精英化的趨勢下可能連工做面試都會受到限制。固然除了很差的影響,數據結構和算法對一個開發能帶來的正向好處也是受益無窮的。也正是基於這些思考,結合本身在職業生涯中曾經踩過的坑因此有了分享數據結構與算法博客相關的想法,但願本身能把它當成興趣和事業堅持下去。將來也但願能有更多志同道和的人加入進來。算法

博客說明

關於大綱

主要的劃分方式分爲基礎大綱和進階大綱。目前一共外發了10篇左右算法相關的博客,內容相對比較少,等初階基礎類型基本覆蓋齊全,相對系統的時候我會統一整理一篇基礎大綱,大概一個月內完成。基礎大綱以後纔會有進階性的算法題博文推送和進階性大綱。穿插在基礎大綱和進階大綱內也會有一些知名互聯網公司的經典面試題。固然,除了算法相關也會穿插一些比較重要的數據結構的源碼分析。編程

關於博客的內容

  • 關於選題和題解

基礎大崗的選題都是比較典型能表明某一類算法思想的題型,進階大綱會對這些算法思想進一步實踐增強理解,全部題型都是通過精心挑選的。而算法相關的題解,基本上保證每一題的算法效率都是100%級別(leetcode評測擊敗100%),每一個題解都附有測評截圖,也有一些題目爲了更好的展現不一樣的算法思想會採起一題多解的形式。數組

  • 關於彩蛋

彩蛋的設計是源自我的經驗中積累的一些有益於提高算法效率的小技巧,通常會以累計的形式,累計足夠4~5個彩蛋發一篇關於彩蛋的說明。有些彩蛋涉及到計算機編譯原理相關的知識因爲主題和篇幅關係暫時不會太過深刻研究分析,可是會有實際數聽說明的demo。性能優化

關於博客的改進建議

一直以來也但願以比較簡單愉快的形式分享知識,本人愚鈍,目前還沒找到比較好的方式,後續會努力作一些改進和嘗試。若是你有好的建議,也歡迎交流~bash

也不排除可能博文中可能出現一些錯誤,一經發現歡迎指正,解題思路也會千差萬別,若是有比博文中更好的比較精彩的思路和方案也歡迎一塊兒交流。能夠加我的微信Aeiric,也能夠關注訂閱號Aeiric(你沒看錯,是同樣的名字)進行留言。或者郵箱xujian2065@163.com微信

概要

閒聊完了,切入正題。有過開發經驗的童鞋可能已經注意到,不少時候在Java標準庫的源碼中能夠看到位運算的身影,本質緣由是位運算能提升算法效率。在以前發佈的博文中曾提到過緣由LeetCode進階-彩蛋一,也有一些實際運用的例子,好比按位與&判斷奇偶數LeetCode進階-1025(動態規劃),移位<<(>>)和&結合存儲數據存取LeetCode進階-1029(貪心)。本篇將結束位運算中的異或運算^的巧妙用法。數據結構

原題

136. Single Number (Easy)

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

Note:數據結構和算法

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1] Output: 1 Example 2:

Input: [4,1,2,1,2] Output: 4

  • tag: Bit Manipulation

136. 只出現一次的數字 (簡單)

給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的算法應該具備線性時間複雜度。 你能夠不使用額外空間來實現嗎?

示例 1:

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

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

  • 分類:位運算

題意分析&&思路設計

根據題意,須要找出數組中惟一的沒有重複出現的整數。因爲本篇是位運算實踐科普篇,在分析以前先來看下^異或運算符的特性:第一個操做數的的第n位於第二個操做數的第n位 相反,那麼結果的第n爲也爲1,不然爲0。簡單來講^運算有兩個比較典型的應用特性:一、相同數字(整數)進行^運算結果爲0。假設a=b,因爲a和b每一位上的數字相同,所以最終a^b=0,結合本題。二、任何數字(整數)異或0,即n^0=n,同理可得。除了一個數字只出現了一次,其餘任何數都出現兩次。也就是[a,a,b,b,c,c...x,d,d,e,e..](列舉示例,實際順序忽略)中找出只出現一次的x。顯然依次將全部數字進行^運算,利用相同數字n^n=0,x^0=x特色最後計算結果必然爲只出現了一次的整數。

編碼實踐

public int singleNumber(int[] nums) {
		int res = 0;
		int len = nums.length;
		for (int i = 0; i < len; i++) {
			res ^= nums[i];
		}
		return res;
	}
複製代碼

結語

本題屬於位運算科普篇,屬於位運算的基本技巧。最後,若是以爲本文對你有所幫助或啓發那就來個贊吧0.0~

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索