程序员面试题精选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只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。
上面题的扩展,找方法三分数组。。。