程序员面试题精选100题:51-63解题报告

程序员面试题精选100题(51)-顺时针打印矩阵[算法]  

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

例如:如果输入如下矩阵:

1              2              3              4
5              6              7              8
9              10           11           12
13           14           15           16

则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9,5, 6, 7, 11, 10。

这题好难好麻烦的说。。。。我很难写对。。。。

===========================================================================

程序员面试题精选100题(52)-C++面试题(1)  

毁三观的题啊,需要看看深入C++对象了。。。。

===========================================================================

程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]  

位操作,异或模拟加法。。。。我想到的是用汇编。

===========================================================================

程序员面试题精选100题(57)-O(n)时间的排序[算法]  

计数排序。。。

===========================================================================

程序员面试题精选100题(58)-八皇后问题[算法]  

题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。

 

分析:是N!种情况,不是8^8种,全排列问题,递归解决。。。

非递归:回溯???

===========================================================================

程序员面试题精选100题(59)-字符串的组合[算法]  

28题扩展里讨论过了,还是递归。。。。

答案的函数定义比较高端,C(n,m)形式,然后for获取所有结果,我直接所有01情况。。。

===========================================================================

程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]  

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:

 

本系列博客的第27,我们曾介绍过如何求二叉树的深度。有了求二叉树的深度的经验之后再解决这个问题,我们很容易就能想到一个思路:在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。这种思路对应的代码如下:

bool IsBalanced(BinaryTreeNode*pRoot)

{

    if(pRoot== NULL)

        return true;

 

    int left =TreeDepth(pRoot->m_pLeft);

    int right =TreeDepth(pRoot->m_pRight);

    int diff = left -right;

    if(diff> 1 || diff < -1)

        return false;

 

    return IsBalanced(pRoot->m_pLeft)&& IsBalanced(pRoot->m_pRight);

}

这种递归会有大量重复计算,子树深度会重复计算。

将判断是否平衡和返回深度结合到一个函数中,只遍历一遍求深度,相当于只求根的深度,从低向根返回。。。。,而且子树不平衡直接返回false,避免了一些节点的计算。。。

bool IsBalanced(BinaryTreeNode*pRoot, int*pDepth)

{

    if(pRoot== NULL)

    {

        *pDepth = 0;

        return true;

    }

 

    int left, right;

    if(IsBalanced(pRoot->m_pLeft,&left)

        &&IsBalanced(pRoot->m_pRight, &right))

    {

        int diff = left -right;

        if(diff<= 1 && diff >= -1)

        {

            *pDepth = 1 + (left > right ? left: right);

            return true;

        }

    }

 

    return false;

}

===========================================================================

程序员面试题精选100题(61)-数对之差的最大值[算法]  

题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。

1.      暴力O(n^2)

2.      动态规划。自己写了个,分的情况太细了,虽说也对但蛮烦了。答案说的就蛮好的。

DP[i]定义为以i为减数的最大插值。

DP[i]=DP[i-1]+a[i-1]-a[i],i之前的最大值为DP[i-1]+a[i-1]或者DP[i]=a[i-1]-a[i],a[i-1]为i之前的最大值。

初始DP[0]=-无穷,

结果为max{DP[i]}0<=i<=n

3.      分治,我发现我总是想不到,智商拙计,复杂度为O(nlogn),不是O(n),O(t)=2O(t/2)+O(n),答案错的。。。

4.      转换为最大连续和问题,想不到诶。。。。

===========================================================================

程序员面试题精选100题(63)-数组中三个只出现一次的数字[算法]  

题目:一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。

上面题的扩展,找方法三分数组。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值