`
love19820823
  • 浏览: 936840 次
文章分类
社区版块
存档分类
最新评论

2010年11月21日微软实习生笔试题--反序对 数目求解

 
阅读更多

题目大意:输入n个正整数(<=2,000,000),计算其中的反序对的个数。例如5,4,3,2,1的反序对数是4对,1,2,3,4,5的反序对数是0。(注意是相邻的逆序,不统计不相邻的逆序,当时搞错了,太冤了,但大概思想是对的。 后来经下面的哥们提醒,确实如果只是相邻的只要O(n)就能解决了,不需要O(nlogn)。那么推理原来的思想是对的,也就是统计所有的,5,4,3,2,1应该是10对。总之给出了两种情况的二叉树方法
解决方法:1)将输入的数字按输入的顺序建立二叉排序树,(如果大于或等于该节点,则比较它的右子树;如果小于则比较它的左子树。当比较到空节点时,则插入这个节点)。
2)计算反序对数,遍历树的每个节点,如果该节点没有左子树则反序对为0,往其右子树遍历。如果该节点右左子树,则统计其左子树上的所有节点的个数。 递归的临界条件是:当前结点的左右结点都为空,返回0。

当时的想法是对的,程序也编的差不多。今天实际在机子上编写,发现原来的纸上的程序还是有很多问题的。(今天也弄了将近一个小时)
昨天的问题:1)没有Public,
2)template针对Class变量的使用错误,建立是需要TreeNode * root=new TreeNode(); 即在类名后面加上类型。 函数传递时也需要将TreeNodeT变量加入。
3)递归的时候在只需要一个函数就可以了,临界条件是对的,但是当右子树时
if(pTree->rightchild!=NULL) //注意是if,不是while,因为已经递归的计算了
{
return CaculateReversePairs(pTree->rightchild);//右子树,不能加1
}
不需要加1,当时可能没哟加1,但是印象中又好像加了,这一点非常重要。
未命名
未命名
未命名

############.cpp#######################

二、如果按照我的思想,即每个节点都要统计左子树所有节点数目。例如5,4,3,2,1逆序数为10,(5.4)……(5,1);(4,3)……(4,1);……(2,1)
这就需要在每次访问该节点时统计该节点左子树的所有节点数目。并且按这种方式中序遍历树中的所有节点。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics