互聯網公司面試題解析

原碼、反碼、補碼

int a = -2147483648;
int b = 0x80000000;

System.out.println(a == b);
System.out.println(String.format("%d,%d,%d,%d,%d", ~a, -a, 1 - a, -1 - a, Math.abs(a)));
true
2147483647,-2147483648,-2147483647,2147483647,-2147483648

int用4個字節表示,每一個字節8位,1位有兩種狀態,一共能夠表示 pow(2,4 * 8)個數。由於有正數和負數的區別,最高位要保留,因此一共能夠表示 2^31個負數,2^31個正數(這裏所說的正數是值最高位符號位是0,從而0是正數),這樣正整數的最大值是2^31-1.-2147483648是最小的負數。整數在計算機中都是以補碼錶示,大於等於0的補碼是其原碼,0的補碼是0,負數的補碼是反碼加1java

正1的原碼(補碼):0000,0000,0000,0000,0000,0000,0000,0001
-1的原碼:1000,0000,0000,0000,0000,0000,0000,0001
-1反碼:1111,1111,1111,1111,1111,1111,1111,1110
-1補碼:1111,1111,1111,1111,1111,1111,1111,1111算法

反碼不針對符號位,切記!

整數最大值的原碼(補碼):0111,1111,1111,1111,1111,1111,1111,1111
整數最小值的原碼:1000,0000,0000,0000,0000,0000,0000,0000
整數最小值的反碼:1111,1111,1111,1111,1111,1111,1111,1111
整數最小值的補碼:1000,0000,0000,0000,0000,0000,0000,0000數組

整數最小值的原碼等於其補碼。整數的表示空間中,負數比正數多一個,所以,對整數的最小值求絕對值,32位整數裝不下,從而溢出,絕對值依舊是個負數網絡

正負轉換是反碼加1

負數最小值~:0111,1111,1111,1111,1111,1111,1111,1111,獲得整數最大值
負數最小值求負-:1111,1111,1111,1111,1111,1111,1111,1111 + 1,從而1000,0000,0000,0000,0000,0000,0000,0000,這個仍然表示負數最小值ide

棧的使用

// 後綴表達式的優勢
// 最左邊必定是數字
// 不用括號,依靠運算符順序肯定運算符的優先級
// 更符合計算機的計算方式:從左到右讀取後綴表達式,就能夠將遇到的運算對象壓入棧中,在遇到運算符的時候就彈出2個運算對象,完成計算後將結果壓入棧中。最後留在棧中的就是計算結果

function solve(str) {
  const tokens = str.split(/\s*/).map(x => x.trim()).filter(x => x.length > 0);
  const isOperator = token => ['+', '-', '*', '/'].indexOf(token) !== -1;

  const opStack = [];
  const valueStack = [];

  // 忽略左括號
  // 遇到操做數放入值棧
  // 遇到操做符放入符號棧
  // 遇到右括號計算後綴表達式,放入值棧
  // 返回棧頂
  for (let token of tokens) {
    if (isOperator(token)) {
      opStack.push(token);
    } else if (token === '(') {
      continue;
    } else if (token === ')') {
      let num2 = valueStack.pop();
      let num1 = valueStack.pop();
      let op = opStack.pop();
      valueStack.push(`${num1}${num2}${op}`);
    } else {
      valueStack.push(token);
    }
  }
  return valueStack.pop();
}

// 解法1沒有區分操做符的優先級,須要人肉加括號,例如:a+b*c-(d+e)/f要寫成((a+(b*c))-((d+e)/f))才能識別
function solve2(str) {

  const priorityMap = {
    '+': 0,
    '-': 0,
    '*': 1,
    '/': 1,

    '(': 1000,
    ')': 1000
  };

  const isOpNum = token => priorityMap[token] === void 0;

  const opStack = [];
  const resultStack = [];

  const tokens = str.split(/\s*/).map(x => x.trim()).filter(x => x.length > 0);

  // 操做數入值棧
  // 左括號入符號棧
  // 遇到右括號則從符號棧中不斷出棧,直至左括號出棧,並把出棧的內容放入值棧
  // 若是當前操做符的優先級大於棧頂優先級,入符號棧
  // 當前操做符優先級小於等於棧頂優先級,則一直出棧,並把出棧內容壓入值棧

  // 右括號不入棧,碰到右括號須要從符號棧中向前掃描找到左括號,並以此將掃描的內容加入值棧
  for (let token of tokens) {
    if (isOpNum(token)) {
      resultStack.push(token);
    } else {
      if (opStack.length === 0) {
        opStack.push(token);
      } else {
        let topOp = opStack[opStack.length - 1];
        let topOpPriority = priorityMap[topOp];
        let curOpPriority = priorityMap[token];
        if (topOp === '(') {
          opStack.push(token);
        } else if (')' === token) {
          while (true) {
            let op = opStack.pop();
            if (op === '(') {
              break;
            }
            resultStack.push(op);
          }
        } else {
          if (curOpPriority > topOpPriority) {
            opStack.push(token);
          } else {
            // 當前運算符優先級小於棧頂運算符優先級
            while (curOpPriority <= topOpPriority) {
              resultStack.push(opStack.pop());
              if (opStack.length === 0) {
                break;
              }
              let top = opStack[opStack.length - 1];
              if (top === '(') {
                break;
              }
              topOpPriority = priorityMap[top];
            }
            opStack.push(token);
          }
        }
      }
    }
  }

  while (opStack.length !== 0) {
    resultStack.push(opStack.pop());
  }

  return resultStack.join('');
}

const ret = solve('((a+(b*c))-((d+e)/f))');
console.log(ret);

const ret2 = solve2('a+b*c-(d+e)/f');
console.log(ret2);

假設一行優先順序存儲三維數組A5[7],其中元素A0[0]的地址爲1100,每一個元素佔用2個存儲單元,求A4[2].函數

4個滿的2維矩陣(67) + 3個滿的一維矩陣(1 7),加2個偏移計算機網絡

offset = 6 7 + 3 7 + 2 = 191
1100 + 191 * 2 = 1482設計

馬路上有編號1,2,3…,10十個路燈,爲節約用電又看清路面,能夠把其中的三隻燈關掉,但不能同時關掉相鄰的三隻或兩隻,在兩端的燈也不能關掉的狀況下,求知足條件的關燈方法共有多少種?code

問題轉化爲在7個亮着的等所造成的6個空隙中尋找3個位置房熄滅的等,C63 = 20orm

房間裏有 8 人,分別佩戴着從 1 號到 8 號的記念章,任選 3 人記錄其記念章號碼, 最大的號碼爲 6 的機率:

最大爲6 那麼餘下二個只能從1-5中選擇,
選擇方法數目爲C(5, 2)
從8個號碼中選擇3個號碼次數C(8, 3)
所以兩個相除,比例爲 C(5, 2)/C(8, 3) = (54 / 2) / (87*6/ 6) = 5 / 28

58同城北京租房列表頁共有3個廣告位,廣告庫中共有5個經紀人,每一個經紀人發佈了2條廣告房源參與此列表頁3個廣告位的隨機展現(即每條廣告房源得到展現的機率是同樣的),則此列表頁展現時,同時展現同一個經紀人的兩條房源的機率是:

共5*2=10條廣告,廣告列有3空位,因此是總共情形:C10 3=120;
同一經紀人(C5 1)的兩條房源(共3條,已有2條,則須要在剩下的8條中選1條,C10-2 1):C 5 1*C 10-2 1=40;
因此40/120=1/3

數組 A 由 1000W 個隨機正整數(int)組成,設計算法,給定整數 n,在 A 中找出符合 以下等式:n=a+b 的 a 和 b,說明算法思路以及時間複雜度是多少

將數組排序,雜度 n*logn 在從頭開始,假設第 i 個位置時 arr[i],那就在 i 到 1000 萬之 間找 n - arr[i] 二分查找的效率是logn,因爲當arr[i] > n/2 時就不用找了,因此最終效 率 2*n*logn.

鬥地主是中國很是流行的一種牌類遊戲:一副撲克 54 張牌,3 人輪抓,每人 17 張, 3 張底牌。請問,同一我的 17 張手牌就抓到火箭(即同時抓到大小王)的機率是多少?

一我的抓到第一張王的機率=17/51,抓到第二張王機率=16/50,因此單獨一我的 抓到機率爲:17/5116/50,那麼 3 人中出現一我的的機率是 317/5116/50 因此最後結果爲:C(52,3)/C(54,3)317/5116/50=0.285

計算機網絡

屬於網絡112.10.200.0/21的地址是()
A 112.10.206.0
B 112.10.217.0
C 112.10.224.0
D 112.10.198.0

ip地主是32位表示,點分十進制中的2個十進制已經去了16位,所以,第三個十進制轉化成二進制後保留21-16=5位,後面的數能夠全0能夠全1。200轉化成二進制是11001000,保留前5位,即11001,則第三位最小值11001000,最大值11001111,即200~207.可排除BCD。

java基礎

Object o = new Object(){
    @Override
    public boolean equals(Object obj) {
        return true;
    }
};

System.out.println(o.equals(false)); // true
byte b1 = 1, b2 = 2, b3, b6;

final byte b4 = 4,
        b5 = 6;

b6 = b4 + b5; 
b3 = b1 + b2; // 編譯不經過

被final修飾的變量是常量,這裏的b6=b4+b5能夠當作是b6=10;在編譯時就已經變爲b6=10了而b1和b2是byte類型,java中進行計算時候將他們提高爲int類型,再進行計算,b1+b2計算後已是int類型,賦值給b3,b3是byte類型,類型不匹配,編譯不會經過,須要進行強制轉換。Java中的byte,short,char進行計算時都會提高爲int類型。

計算斐波那契數列第n項的函數定義以下

int fib(int n){ 
     if(n==0) 
        return 1; 
     else if(n==1) 
        return 2; 
     else 
        return fib(n-1)+fib(n-2);
}

若執行函數調用表達式fib(10),函數fib被調用的次數是:

設f(n) 表示執行fib(n)函數的次數,那麼顯然地推公式: f(n) = f(n-1) + f(n-2) + 1 (1表示執行到了fib(n)的時候執行了一次fib函數)

f(10) = f(9) + f(8) + 1

f(0) = 1f(1) = 1f(2) = 3f(3) = 5f(4) = 9f(5) = 15f(6) = 25f(7) = 41f(8) = 67f(9) = 109f(10) = 177

相關文章
相關標籤/搜索