1. 程式人生 > >小米2015筆試編程題

小米2015筆試編程題

時間 一個 註意 代碼管理 不同的 字符 結果 位運算 賣出

小米2015筆試編程題

1.[編程題] 懂二進制

時間限制:1秒

空間限制:32768K

世界上有10種人,一種懂二進制,一種不懂。那麽你知道兩個int32整數m和n的二進制表達,有多少個位(bit)不同麽?

輸入例子1:

1999 2299

輸出例子1:

7

分析:第一步求這兩個數的異或,得到一個新的數,相同位是0,不同位是1;第二步采用位運算求這個數裏邊1的個數即為結果

 1 class Solution {
 2 public:
 3     /**
 4      * 獲得兩個整形二進制表達位數不同的數量
 5      * 
 6      * @param m 整數m
 7      * @param n 整數n
8 * @return 整型 9 */ 10 int countBitDiff(int m, int n) 11 { 12 int res=m^n; 13 int count=0; 14 while(res) 15 { 16 ++count; 17 res=(res-1)&res; 18 } 19 return count; 20 } 21 };

2.

[編程題] 風口的豬-中國牛市

時間限制:1秒

空間限制:32768K

風口之下,豬都能飛。當今中國股市牛市,真可謂“錯過等七年”。 給你一個回顧歷史的機會,已知一支股票連續n天的價格走勢,以長度為n的整數數組表示,數組中第i個元素(prices[i])代表該股票第i天的股價。 假設你一開始沒有股票,但有至多兩次買入1股而後賣出1股的機會,並且買入前一定要先保證手上沒有股票。若兩次交易機會都放棄,收益為0。 設計算法,計算你能獲得的最大收益。 輸入數值範圍:2<=n<=100,0<=prices[i]<=100

輸入例子1:

3,8,5,1,7,8

輸出例子1:

12

分析:

計算兩次交易機會所獲收益最大值,則可以先正序遍歷一遍記錄第k天時第一次交易可以獲得的最大收益,然後再後序遍歷一次,記錄第k天時後面有第二次交易可獲的最大收益。再將第k天的兩次交易最大值相加比較即可獲得結果。註意,正序遍歷時表示在第k天之前可以獲得的最大收益,後序遍歷表示第k天後面可以獲得的最大收益。了兩個收益相加就是最大收益。

 1 class Solution {
 2 public:
 3     /**
 4      * 計算你能獲得的最大收益
 5      * 
 6      * @param prices Prices[i]即第i天的股價
 7      * @return 整型
 8      */
 9     int calculateMax(vector<int> prices) {
10         int len = prices.size();
11         vector<int> leftmax(len);
12         vector<int> rightmax(len);
13         
14         //正序遍歷
15         int primin = prices[0];
16         leftmax[0] = 0;
17         for(int i=1;i<len;++i){
18             primin = min(primin, prices[i]);
19             leftmax[i] = max(leftmax[i-1], prices[i] - primin);
20         }
21         
22         //後序遍歷
23         int primax = prices[len-1];
24         rightmax[len-1] = 0;
25         for(int i=len-2;i>=0;--i){
26             primax = max(primax, prices[i]);
27             rightmax[i] = max(rightmax[i+1], primax - prices[i]);
28         }
29         
30         int pmax = 0;
31         for(int i=0;i<len;++i)
32             pmax = max(pmax, leftmax[i] + rightmax[i]);
33         return pmax;
34         
35     }
36 };

3.[編程題] 小米Git

時間限制:1秒

空間限制:32768K

git是一種分布式代碼管理工具,git通過樹的形式記錄文件的更改歷史,比如: base‘<--base<--A<--A‘ ^ | --- B<--B‘ 小米工程師常常需要尋找兩個分支最近的分割點,即base.假設git 樹是多叉樹,請實現一個算法,計算git樹上任意兩點的最近分割點。 (假設git樹節點數為n,用鄰接矩陣的形式表示git樹:字符串數組matrix包含n個字符串,每個字符串由字符‘0‘或‘1‘組成,長度為n。matrix[i][j]==‘1‘當且僅當git樹種第i個和第j個節點有連接。節點0為git樹的根節點。)

輸入例子1:

[01011,10100,01000,10000,10000],1,2

輸出例子1:

1

分析:題意沒太理解,理解了再補充

小米2015筆試編程題