首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

阿里巴巴2014笔试算法题集锦

2013-10-03 
阿里巴巴2014笔试算法题汇总1.两棵二叉树T1和T2,T1的节点数是百万量级,T2的节点数一千以内,请给出判断T2是

阿里巴巴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



热点排行