我這裡複製的是原話,當然順序是不一定的,很多拿到題目第一反應就是用map,當然可以解決,但是效率不高。
還有人覺得應該用演算法***,我是沒想到用啥演算法好...!
還有覺得應該先排序...
還有覺得用位圖....bitmap 等等方法!
我都覺得麻煩,思維方式就是,從節省時間考慮,從陣列來看,我們都得遍歷一次陣列裡面的元素,那麼我就想只遍歷一次,就能得到結果的方法,然後由演算法去優化,這是我通常考慮類似問題的辦法。
第一種情況:
由於陣列元素限定,我們先假設我們能知道最大的數字,我這裡用另一組資料測試:
;
可以看出8 是最大的數字,那麼我就可以建立乙個長度為9的陣列index,只要出現一次數字,就在相應的位置++。
比如數字1 ,那麼我就在index[1] ++ .進行處理,那麼迴圈一次之後我就知道每個元素出現的次數。
但是還得迴圈去判斷是奇數還是偶數,這裡做點小改進,在存放的時候就可以判斷。比如,1 出現一次,我就在index[1] 的位置 設定為1,出現第二次,我就讓index[1] 的位置變為0, 那麼陣列裡面只要為1 的,都是出現的奇數,並且位置和元素等價,可以看**。
static int nums = ;
// 我假設我知道元素最大的數
static int maxnum = 9;
static int index = new int[maxnum];
public static void main(string args) ;
// 我假設我知道元素最大的數 +1
static int maxnum = 1024*1024*100+1;
static boolean index = new boolean[maxnum];
public static void main(string args) ;
// 我假設我知道元素最大的數
static int max = 1024*1024*100*3+1;
static byte bits = new byte[(max + 7) >> 3];
public static void main(string args)
// 輸出
for (int i = (bits.length << 3) - 1; i >= 0; i--)
} }// 第一步,求出該數應該放在byte 陣列哪個位置,相當於n/8 得出位置
// 比如1~7 之間的放[0] 相當於1~7/8 位置,8~15[1] 8~15/8位置,依次類推
public static int index(int n)
// 第二步,計算n在陣列裡面的偏移量,比如:3%8 = 3,在陣列裡面的位置我們應該放在0000 0100 這種表示
public static int offset(int n)
// 第三步,剛才的位置和偏移量做異或運算,做異或的原因就是當出現偶數次的時候 進行歸0
// 比如假設第乙個數字 3,計算位置在[0] 的位置。預設 [0] 的bit 元素二進位制:
// // 那麼第一次就將1 << 3位,二進位制是:0000 00001 << 3 == 0000 0100 ,然後將和[0] 位 // 置的做異或運算
// 0000 0000
// ^0000 0100
// 0000 0100 這表示已經存放了一次值:3
// 如果第二個元素還是3,再次操作就變成了:0000 0000,就歸0了
public static void set(int n)
// 獲取位置的元素,從最高位開始遍歷,假設bit陣列兩個長度分別是:
// [0]=> 3
// [1]=> 13 10
// 總長度也就是16位,當我們獲取get[15] 的時候,
// 以同樣的方式可以得到15/8 = 7的位置在[1] 裡面的最高位,也就是0
// 如果是get[3],那麼獲取的就是[0],4/8 = 4 位置的1,這裡位置通過位移操作完成的
public static boolean get(int i)
可以看出,我們允許的範圍增加了很多,理論上可以增加8倍。
關於記憶體限制這塊,可以通過命令:
runtime r = runtime.getruntime();
system.out.println(r.totalmemory()/1024/1014);
system.out.println(r.maxmemory()/1024/1014);
system.out.println(r.freememory()/1024/1014);
大概估計,但是我們並不能建立乙個byte[r.maxmemory()] 我jdk1.7 的限制在r.maxmemory()*0.69 就
oom了,我記得可以通過命令調節,但是- -忘記命令了。
小結:
1.很高興大家有興趣來研究這種小演算法,更加熟悉嘛。
3.演算法同樣是不完善的,還有改進的餘地,多專研啦~。~ 還有一些邊界問題,考慮不周。
4.關於bit 類似的計算,可以專門花時間看看,可以嘗試大檔案的的一些處理哦
5。有不正確的地方還請指正。
一道百度面試題
給出乙個整型陣列num,對其中的每個元素,輸出在它左側且比它小的最近元素,要求時間複雜度為o n 例如int num 2無左側最近元素 4左側最近的是2 1沒有 3左側最近的是1.分析 建立乙個棧,然後將陣列中的元素從右至左依次壓入棧中。對每個元素,入棧前先檢查棧頂元素是否比它大,若是的話,則該元素...
一道百度面試題
下面這段 是把中英文混合字串 漢字用兩個位元組表示,特點是第乙個位元組的最高位為1 中的大寫字母轉化為小寫字母,請找出其中的bug,注意各種異常情況。for char piterator szword piterator 0 piterator else if piterator a piterat...
憶一道百度面試題
題意 題目大概的意思是有乙個n x n的矩陣方格,在這個矩陣中有m個硬幣,每個硬幣的位置事先知道,且乙個格仔最多只能放乙個硬幣,現有乙個機械人從 0,0 的位置開始走,每次只能向下或者向右走一格,最終到達 n,n 設計程式計算機械人能拿到的最大的硬筆數。看到這個題目一看就是乙個動態規劃的問題。既然是...