阿里巴巴2014筆試演算法題彙總
阿新 • • 發佈:2018-10-31
1.兩棵二叉樹T1和T2,T1的節點數是百萬量級,T2的節點數一千以內,請給出判斷T2是否T1子樹的可行演算法。
分析:首先想到的是遞迴,但是T1的數量級太大,遞迴會導致棧溢位,於是以非遞迴實現。
bool IsSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { if (pRoot1 == NULL || pRoot2 == NULL) { return false; } stack<BinaryTreeNode*> stk; stk.push(pRoot1); while (!stk.empty()) { BinaryTreeNode *tmp = stk.top(); stk.pop(); if (tmp->m_nValue == pRoot2->m_nValue) { stack<BinaryTreeNode*> first; BinaryTreeNode *f; stack<BinaryTreeNode*> second; BinaryTreeNode *s; first.push(tmp); second.push(pRoot2); bool find = true; while (!first.empty()) { f = first.top(); first.pop(); s = second.top(); second.pop(); if (f->m_nValue != s->m_nValue) { find = false; break; } if (s->m_pLeft != NULL) { if (f->m_pLeft == NULL) { find = false; break; } else { first.push(f->m_pLeft); second.push(s->m_pLeft); } } if (s->m_pRight != NULL) { if (f->m_pRight == NULL) { find = false; break; } else { first.push(f->m_pRight); second.push(s->m_pRight); } } } if (find == true && first.empty()) { return true; } } if (tmp->m_pLeft != NULL) { stk.push(tmp->m_pLeft); } if (tmp->m_pRight != NULL) { stk.push(tmp->m_pRight); } } return false; }
從1到500的500個數,第一次刪除奇數位,第二次刪除剩下來的奇數位,以此類推,最後剩下的唯一一位數是:
A.500 B.256C.250 D.128
分析:
比如:1,2,刪除奇數位,那剩下的是2,
1,2,3,刪除奇數位,剩下的是2,
1,2,3,4,剩下的是4,
1,2,3,4,5,6,7,剩下的是4,
1,2,3,4,5,6,7,8和1,2,3,4,5,6,7,8,9,10,11,12,13,14,15剩下的是8,
這裡有什麼規律:就是當1~n,2^i<n<2^(i+1)時候,這樣刪除剩下的是2^i。
2^8<500<2^9,所以剩下的就是2^8=256。
轉載請註明原創連結:http://blog.csdn.net/wujunokay/article/details/12233223