阿里巴巴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.250D.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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值