lintcode 落單的數(位操作)

題目1?落單的數

  給出2*n + 1?個的數字,除其中一個數字之外其他每個數字均出現兩次,找到這個數字。

  鏈接:http://www.lintcode.com/zh-cn/problem/single-number/

樣例

  給出?[1,2,2,1,3,4,3],返回 4

挑戰

  一次遍歷,常數級的額外空間復雜度

解決方案

  方法1思路:將所有的數轉換成二進制,因為是int類型,共32位。申請常數級(32位)的額外空間,然后每個數對應的位相加,最后對應位上的和模2。最后的結果就是單個數對應的二進制數。

class Solution {
public:/*** @param A: Array of integers.* return: The single number.*/int singleNumber(vector<int> &A) {// write your code hereint ans[35];memset(ans, 0, sizeof(ans));for(int i=0; i<A.size(); ++i){for(int k=0; k<32; k++)ans[k] = (ans[k]+((A[i]>>k)&1))%2;}int ret = 0;int base = 1;for(int i=0; i<32; ++i){ret += ans[i]*base;base *= 2;}return ret;}
};

  方法2思路:通過異或,相同的數結果為0,那么最后的結果一定是落單的數字。

class Solution {
public:/*** @param A: Array of integers.* return: The single number.*/int singleNumber(vector<int> &A) {// write your code hereint ans = 0;for(int i=0; i<A.size(); ++i)ans ^= A[i];return ans;}
};

題目2?落單的數?II

  給出3*n + 1 個的數字,除其中一個數字之外其他每個數字均出現三次,找到這個數字。

  鏈接:http://www.lintcode.com/zh-cn/problem/single-number-ii/

樣例

  給出?[1,1,2,3,3,3,2,2,4,1]?,返回 4

挑戰

  一次遍歷,常數級的額外空間復雜度

解決方案

  同上一題的方法1一樣的思路。

class Solution {
public:/*** @param A : An integer array* @return : An integer */int singleNumberII(vector<int> &A) {// write your code hereint ans[35];memset(ans, 0, sizeof(ans));for(int i=0; i<A.size(); ++i){for(int k=0; k<32; k++)ans[k] = (ans[k]+((A[i]>>k)&1))%3;}int ret = 0;int base = 1;for(int i=0; i<32; ++i){ret += ans[i]*base;base *= 2;}return ret;}
};

?

題目3:落單的數?III

  給出2*n + 2個的數字,除其中兩個數字之外其他每個數字均出現兩次,找到這兩個數字。

  鏈接:http://www.lintcode.com/zh-cn/problem/single-number-iii/

樣例

  給出?[1,2,2,3,4,4,5,3],返回 1和5

挑戰

  O(n)時間復雜度,O(1)的額外空間復雜度

解決方案

      

  如上圖所示,所有數的異或的結果等于兩個落單數異或的結果(設為S)。如何根據這個異或的結果將落單的數找出來呢?首先,S的值一定不為0,那么找到S對應的二進制數值為1的位(找到任意一個位為1都行, 這里我們找到S的二進制最后一個為1的位,設為P),根據這一個位置,將所有的數劃分成兩部分,一部分是對應二進制P位是1,另一部分對應二進制P位是0。這樣就把兩個落單的數劃分到了不同的集合里去了。如上圖的紅色框集合和綠色框集合。然后就轉換成“2*m+1個數字,除了一個數字其他數字均出現兩次”的問題,也就是題目1:落單的數I

class Solution {
public:/*** @param A : An integer array* @return : Two integers*/int findNum(int k, vector<int> &A, bool flag){int ret = 0;for(int i=0; i<A.size(); ++i){if(flag && (1<<k)&A[i])ret ^= A[i];if(!flag && !((1<<k)&A[i]))ret ^= A[i];}return ret;}vector<int> singleNumberIII(vector<int> &A) {// write your code hereint x = 0;for(int i=0; i<A.size(); ++i)x ^= A[i];int k = 0;for(k; k<32; ++k)//找到異或值最后一個1,說明該位置P之后,兩個不同的數對應的二進制是相同的if((1<<k)&x)break;//根據這個位置P,轉換成“2*m+1個數字,除了一個數字其他數字均出現兩次”的問題//將位置P上對應為1的數字異或得到一個數字,然后再將位置P上對應為0的數字異或得到一個數字,最后得到答案vector<int> ans;ans.push_back(findNum(k, A, true));ans.push_back(findNum(k, A, false));return ans;}
};

?

轉載于:https://www.cnblogs.com/hujunzheng/p/5045084.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531368.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

旋轉圖像

旋轉圖像 給定一個NN的二維矩陣表示圖像&#xff0c;90度順時針旋轉圖像。 看個例子 算法1&#xff1a; 如上圖所示&#xff0c;設一個N階二維矩陣&#xff0c;則將矩陣從外向里可以分成N/2個圈&#xff0c;例如&#xff08;1 2 3 4 8 12 16 15 14 13 9 5&#xff09;這是最外邊…

嵌入式開發板模擬器:QEMU

前兩天看微信公眾號時發現了一個嵌入式模擬器&#xff0c;感覺很不錯&#xff0c;自己動手安裝了一個&#xff0c;折騰了幾天&#xff0c;下載一直是個問題&#xff0c;特此記錄如下 模擬器大家應該都聽說過&#xff0c;有的小伙伴打游戲也會安裝模擬器&#xff0c;今天我們介紹…

gcc: weak_alias如何使用

本文主要說明weak和alias是什么和如何使用它 __attribute__是用來說明函數的屬性&#xff0c;weak和alias分別是兩個屬性。 &#xff08;一&#xff09;強符號和弱符號&#xff1a; 強符號&#xff1a;已經初始化的全局變量和未被weak修飾的函數弱符號&#xff1a;未初始化的全…

靜態Include和動態Include測試并總結

主要代碼 hjzgg.css .center-div{width:auto;margin-left: 40%;margin-right: 40%;display: block;position: absolute;top:0px;left:0px; }.text-div{margin-top: 80px; }.hjzgg-div{color:transparent;font-size:20px;font-weight: bold;letter-spacing:2px;-webkit-animatio…

linux終端常用快捷鍵

CTRLALTT 打開終端 CTRLD 關閉終端 CTRL SHIFT "" 放大終端字體 CTRL “-” 縮小終端字體 CTRL r 查找歷史命令 CTRLu 刪除光標前面所有內容 CTRLw 刪除光標左邊的單詞 CTRL k 刪除光標后面的所有內容 CTRLL 清除當前屏幕內容 CTRLa 光標移到開始位置 CTRLe 光標移到…

ueditor的配置和使用

ueditor下載好之后直接復制到項目的WebContent目錄下&#xff0c;并將ueditor\jsp\lib下的jar包復制或者剪切到項目的lib目錄下。先看一下效果&#xff0c;如下&#xff1a; 1.文件的上傳 首先在ueditor/jsp目錄下找到config.json文件&#xff0c;就拿Image上傳來說吧。 "…

windows上搭建NFS服務器

在進行嵌入式開發的時候&#xff0c;我們常用的做法是搭建NFS服務器&#xff0c;然后使把文件系統、調試程序放在NFS服務器上&#xff0c;這樣可以方便調試&#xff0c;以前都是在linux里面開啟NFS服務器&#xff0c;今天來說下window里的nfs服務器–haneWin 一、軟件安裝和使…

計算機是如何啟動的?從未上電到操作系統啟動

計算機是如何啟動的&#xff0c;網絡上很多博文1都從 BIOS 程序的加載開始說起&#xff0c;有的也跳到 BIOS 程序加載 Bootloader 階段。個人認為把這個過程稱為操作系統是如何被加載并啟動應該更加貼切一點。同時&#xff0c;也有計算機硬件大神的文章[1][5]詳細分析計算機加電…

Hibernate注解

前言&#xff1a; 最近正在學習Hibernate通過注解&#xff08;annotation&#xff09;來管理映射關系&#xff0c;以前都是通過XML映射文件。下面拿個小例子說一下。 數據庫物理模型&#xff1a; 數據庫的描述&#xff1a; 一篇博客隨筆可以分到不同的類中&#xff0c;一個類中…

js表單動態添加數據并提交

情景1&#xff1a;已經存在form對象了&#xff0c;動態為form增加對象并提交 function formAppendSubmit(){var myform$(#newArticleForm); //得到form對象var tmpInput$("<input typetext nameblogArticleForm.articleContent/>");tmpInput.attr("value&…

*++p和*p++的區別

首先你應該明白* 和 的優先級是相同的&#xff0c;而且他們的結合性是從又往左的 #include <stdio.h>int main(int argc ,char * argv[]) {int str[]{1,2,3,4,5,6,7,8,9,10};int *p str;int a *p;//a*p ,pp1即a1&#xff0c;p&str[1]int b *p;//pp1,b*p即p&s…

zyUpload+struct2完成文件上傳

前言&#xff1a; 最近在寫自己的博客網站&#xff0c;算是強化一下自己對s2sh框架的理解。期間遇到了很多問題&#xff0c;這些問題在寫之前都考慮過&#xff0c;感覺也就是那樣吧。但正真遇到了&#xff0c;也挺讓人難受的。就利用zyUpload這個js插件實現文件的上傳&#xff…

gbd的簡單使用(一)

這篇文章將gdb的簡單使用&#xff0c;通過此篇文章你能學習到使用gdb進行調試程序 在Linux中編寫程序時&#xff0c;如何進行程序的debug工作呢&#xff1f;今天來介紹下gdb這個工具&#xff0c;可以在Linux下直接man gdb查看幫助信息 &#xff08;一&#xff09;gdb命令介紹 …

java發送內嵌圖片郵件

前言&#xff1a; 博客系統中需要郵件服務的功能&#xff0c;以前寫過類似的功能&#xff0c;不過功能太簡單了&#xff0c;僅僅是發送文本內容&#xff0c;現在嘗試一下發送內嵌圖片郵件&#xff01; 準備工作&#xff1a; 請參考&#xff1a;http://www.cnblogs.com/hujunzhe…

調試跟蹤利器---strace

通過這篇文章你會學習到strace的用法&#xff0c;strace可以幫助你高效地定位進程中的一些錯誤&#xff0c;關于strace的用處有很多&#xff0c;可以自行發掘 前面我們講解了gdb調試程序,這篇文章介紹另一個調試跟蹤工具strace&#xff0c;同樣你可以在linux下執行man strace查…

MBR、DBR、FAT32基礎小知識

MBR-------主引導記錄 1.創建時間&#xff1a;由分區軟件&#xff08;Fdisk/PartitionMagic/Windows 2000/Windows XP安裝 工具等&#xff09;給 硬盤分區時建立的。 2.功能 &#xff1a;存放硬盤分區信息和引導系統時檢查分區。 3.作用范圍&#xff1a;MBR和虛擬MBR控制著整個…

java使用Executor(執行器)管理線程

一.一個實現了Runnable接口的類 class MyThread implements Runnable{private static int num 0;Overridepublic void run() {while(true){synchronized(MyThread.class){num;try{Thread.sleep(500);} catch(Exception e){System.out.println(e.toString());}System.out.print…

JMM和happens-before原則

JMM&#xff1a; Java Memory Model(Java內存模型)&#xff0c;圍繞著在并發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。 可見性&#xff1a; JMM提供了volatile變量定義、final、synchronized塊來保證可見性。  例如&#xff1a;線程a在將共享變量x1寫入…

SD卡移植FAT32文件系統無MBR

問題&#xff1a;在研究SD卡和FAT32文件系統的時候&#xff0c;發現SD卡有的有MBR&#xff0c;有的沒有MBR&#xff0c;這個為什么呢&#xff1f; 分析&#xff1a;MBR是主引導記錄&#xff0c;是在給磁盤分區的時候建立的&#xff0c;我們的SD卡沒有這個可能就是沒有進行過分區…

java獲取類的信息

關鍵技術剖析 1.java.lang.reflect包實現了java的反射機制&#xff0c;在使用反射機制時&#xff0c;需要導入該包。 2.Class類的forName方法能夠根據類名加載類&#xff0c;獲得類的Class對象。 Class類的getSuperclass方法獲得父類的Class對象&#xff1b;getDeclaredFields方…