看大神文章小结——微软等面试12,13,14

大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165

第 12 题(语法)
题目:求 1+2+…+n,
要求不能使用乘除法、 for、 while、 if、 else、 switch、 case 等关键字以及条件判断语句(A?B:C)。


懵了。。。。。第一反应 估计需要用移位来处理。 想不出来 看了答案觉的没意识。 搞的像脑筋急转弯了。 这题不看了。


第 13 题(链表):
题目:输入一个单向链表,输出该链表中倒数第 k 个结点。链表的倒数第 0 个结点为链表
的尾指针。
链表结点定义如下: 
struct ListNode 

{
int m_nKey;
ListNode* m_pNext;
};

这一题 我觉的没难度。因为 又没有设定要求。 难道我遍历一次 得到总长度 减去 k 在做一次 定位。。当然 看了答案 比这种方法巧妙。 不过仍然 觉的没多大意识。 继续下一题吧。


第14题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是 O(n)。
如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
//由于数组已经过升序排列,所以,难度下降了不少。
//July、2010/10/19


第一个想法 通过2分查找 找到最接近 并且小于 给定数字的 值 然后相减。 得出的结果 再去2分查找一下。如果能找到 就是 不能找打刚刚找到 大的那边 向前 一个 继续那个操作。 不过 貌似 时间复杂度不会是 O(n) 于是优化一下

思路这样的 有2个指针 一个 从后面向前移动, 我把他就做 大指针  一个从前面向后移动(小指针)。这一步可以通过2分查找 迅速定位 可能会快一点 当然。 反正 定位到  后面那个指针 指向 从后遍历 第一个 比给定的值小的。 前面的指针 指向 加起来 刚好 小于等于给定的值。 如果小指针前移后 相加的值大于给定的值。那么 大指针前移。如果小于 小指针 前移。一直到相遇。


	public void getTheData(int[] data,int sum){
		int i=0;
		int j=data.length-1;
		while(i<j){
			int nowSum=data[i]+data[j];
			if(nowSum==sum){
				System.out.println("找到了:i="+i+";j="+j);
				break;
			}else if(nowSum<sum){
				i++;
			}else{
				j--;
			}
		}
	}

测试 ok


第 15 题(树):

题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。


用递归 应该 一点问题都没有吧 只是左右节点互换而已。循环 就有点不会了。 看答案 感觉 也是有点饶人的意思。答案就是 自己定义一个栈。保存每个节点。 就是 将递归翻译成了循环。 代码就不写了 很简单。 把别人的答案贴过来

void Revertsetree(list *phead)
{
if(!phead)
return;
stack<list*> stacklist;
stacklist.push(phead); //首先把树的头结点放入栈中。
while(stacklist.size())
//在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树
{
list* pnode=stacklist.top();
stacklist.pop();
list *ptemp;
ptemp=pnode->leftch;
pnode->leftch=pnode->rightch;
pnode->rightch=ptemp;
if(pnode->leftch)
stacklist.push(pnode->leftch); //若有左子树,把它的左子树压入栈中
if(pnode->rightch)
stacklist.push(pnode->rightch); //若有右子树,把它的右子树压入栈中
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值