百度一道面試題

2021-09-02 03:03:53 字數 2629 閱讀 6406

我這裡複製的是原話,當然順序是不一定的,很多拿到題目第一反應就是用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 設計程式計算機械人能拿到的最大的硬筆數。看到這個題目一看就是乙個動態規劃的問題。既然是...