阿里巴巴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; }
从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.****.net/wujunokay/article/details/12233223