1. 程式人生 > >阿里巴巴2014筆試演算法題彙總

阿里巴巴2014筆試演算法題彙總


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;  
}  


2.

從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