`

0820-mirosoft

阅读更多

传说中微软的几道算法题,练习一下吧:

 

1.设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
复杂度如果是O(n2)则不得分。

 

	/*
	 * 获得两个节点共同的父节点
	 */
	public ArrayList<BiTreeNode> getCommonParents(BiTreeNode node1,
			BiTreeNode node2, BiTreeNode root) {
		ArrayList<BiTreeNode> commonList = new ArrayList<BiTreeNode>();
		ArrayList<BiTreeNode> node1ParentList = new ArrayList<BiTreeNode>();
		ArrayList<BiTreeNode> node2ParentList = new ArrayList<BiTreeNode>();
		node1ParentList = getParents(node1, root);
		node2ParentList = getParents(node2, root);
		int len1 = node1ParentList.size();
		int len2 = node2ParentList.size();
		for (int i = 0; (i < len1) && (i < len2); i++) {
			char data1 = node1ParentList.get(i).getData();
			char data2 = node2ParentList.get(i).getData();
			if (data1 == data2) {
				commonList.add(node1ParentList.get(i));
			}
		}

		return commonList;

	}

	/*
	 * 获得一个节点的所有父节点
	 */
	ArrayList<BiTreeNode> getParents(BiTreeNode node, BiTreeNode root) {
		int top = 0;
		ArrayList<BiTreeNode> stack = new ArrayList<BiTreeNode>();
		BiTreeNode pointer = root;
		while (top > 0 || pointer != null) {
			if (pointer != null) {
				if (pointer.getData() == node.getData()) {
					return stack;
				}
				stack.add(pointer);
				top++;
				pointer = pointer.getLeftChild();
			} else {
				BiTreeNode topNode = stack.get(top - 1);
				while(topNode.getVisit() == 1) {
					stack.remove(--top);
					topNode = stack.get(top - 1);
				} 
				topNode.setVisit(1);
				pointer = topNode.getRightChild();
			}
		}

		return stack;
	}

 

   

 

2.一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。
复杂度如果是O(n2)则不得分。

 

package org.jyjiao;
import java.util.*;
//创建一棵二叉树
//判定是否是一棵二叉排序树
//插入一个节点
//一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
/*已知有一棵二叉排序树,其中保存了 n 个互不相同的元素,且左子树中的元素小于根小于右子树中的元素。现在给你这棵二叉排序树的前序遍历序列,请你给出一个算法能够把这棵二叉排序树重新构造起来。具体实现不拘,用伪码说明也可以,但是要求: 

1、说明你的算法的正确性。 
2、分析你的算法的时间复杂度。
*/

class TreeNode{
	int data;
	TreeNode leftChild,rightChild;
	public int getData(){
		return this.data;
	}
	public void setData(int data){
		this.data=data;
	}
	
	public TreeNode getLeftChild(){
		return this.leftChild;
	}
	public TreeNode getRightChild(){
		return this.rightChild;
	}
	
	public void setLeftChild(TreeNode leftChild){
		this.leftChild=leftChild;
	}
	public void setRightChild(TreeNode rightChild){
		this.rightChild=rightChild;
	}
	
	public TreeNode(int data){
		this.data=data;
		this.leftChild=null;
		this.rightChild=null;
	}
		
}

public class OrderBiTree{
	TreeNode root;
	ArrayList<TreeNode> nodeArray=new ArrayList<TreeNode>();

	public OrderBiTree(){
		root=null;
	}
	public TreeNode createOrderTree(int[] array){
		for(int i=0;i<array.length;i++){
			TreeNode newNode=new TreeNode(array[i]);
			insert(newNode);
		}
		return root;
	}
	
	public void insert(TreeNode node){
		if(root==null){
			root=node;
		}
		else{
			TreeNode pNode=root;
			while(true){
				if(node.getData()<=pNode.getData()){
					if(pNode.getLeftChild()==null){
						pNode.setLeftChild(node);
						return;
					}else{
						pNode=pNode.getLeftChild();
					}
				}
				else{
					if(pNode.getRightChild()==null){
						pNode.setRightChild(node);
						return;
					}else{
						pNode=pNode.getRightChild();
					}
					
				}
			}//while
		}//else
	}
	
	public TreeNode findNode(TreeNode root){
		if(root==null){
			return null;
		}
		int middle=(nodeArray.get(0).getData()+nodeArray.get(nodeArray.size()-1).getData())/2;
		TreeNode pointer=root;
		ArrayList<TreeNode> bigList=new ArrayList<TreeNode>(); 
		
		while(true){
			if(middle<=pointer.getData()){
				bigList.add(pointer);
				if(pointer.getLeftChild()==null){
					break;
				}
				pointer=pointer.getLeftChild();
			}
			if(middle>pointer.getData()){
				if(pointer.getRightChild()==null){
					break;
				}
				pointer=pointer.getRightChild();
			}
		}
		return bigList.get(bigList.size()-1);
		
		
	}
	
	
	public void middleTravel(TreeNode root){
		if(root==null){
			return;
		}
		middleTravel(root.getLeftChild());
		System.out.print(root.getData()+" ");
		nodeArray.add(root);
		middleTravel(root.getRightChild());
		
	}
	
	public static void main(String[] args){
		int[] array={10,9,3,15,20,5,30};
		OrderBiTree tree=new OrderBiTree();
		TreeNode orderTree=tree.createOrderTree(array);
		tree.middleTravel(orderTree);
		TreeNode bigNode=tree.findNode(orderTree);
		System.out.println("\nbigNode.getData()="+bigNode.getData());
	}
	
}

 

3.一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n),如果是O(n2)则不得分。

分享到:
评论

相关推荐

    Mirosoft Chart Control 集合打包

    Mirosoft Chart Control 工具打包集合。 都是从Mirosoft网站下载的资源 包括 chartcontrol安装程序 chartcontrol addon安装程序 chartcontrol 语言包安装程序 chartcontrol 的b/s和c/s的官方实例代码 环境要求为...

    Beginning Kinect Programmg with the Mirosoft Kinect SDK

    《Beginning Kinect Programming with the Microsoft Kinect SDK》是一本专门教授如何使用微软Kinect SDK进行Kinect Windows编程的书籍,全书以英文撰写,由Apress出版社出版。Kinect原本是微软公司为XBOX游戏机设计...

    mirosoft.office.core的DLL,开发WORD应用时可以用到

    "mirosoft.office.core"的DLL(动态链接库)就是这样的一个组件,它提供了与Microsoft Office套件,特别是Word,进行深度交互的能力。这篇内容将深入探讨如何在C#编程环境下使用这个DLL以及它能为开发者带来的便利。...

    如何重装Windows Mirosoft Store

    标题中的“如何重装Windows Microsoft Store”意味着我们将讨论在Windows操作系统上重新安装或修复Microsoft Store应用的步骤。这个过程对于那些遇到商店应用故障或者需要更新到最新版本的用户来说非常有用。...

    汇编link 5.13

    这是老版的汇编连接程序,因为老才珍贵吗,给大家看看用用

    微软Edge浏览器怎样清除浏览历史记录?.docx

    ### 如何在微软Edge浏览器中清除浏览历史记录 随着互联网技术的发展与普及,浏览器成为我们日常生活中不可或缺的一部分。为了保护个人隐私以及优化浏览器性能,定期清理浏览器的历史记录变得尤为重要。...

    Intercept Redirect-crx插件

    语言:English ...有关此扩展程序支持的域的列表,请访问https://github.com/bjornstar/intercept-redirect对于Mozilla Firefox用户-https://intercept-redirect.firefox.bjornstar.com对于Mirosoft Edge用户- ...

    Microsoft drivers for php for sql server帮助手册 中文

    #### 系统要求与环境配置 ... ##### 操作系统兼容性 ...- **Windows Server 2003 Service Pack 1** - **Windows XP Service Pack 3** ...以上列出的操作系统均经过验证,确保可以支持该驱动程序正常运行。...

    Microsoft Visual C++ 2010 Redistributable Package 10.0.40219(32/64).zip

    Microsoft Visual C++ 2010 Redistributable Package 10.0.40219 是一个关键的软件组件,对于许多依赖于Microsoft Visual C++运行时库的应用程序来说,它是必不可少的。这个包包括了运行时库的动态链接库(DLLs),...

    how we test software at microsoft

    how we test software at microsoft, 英文版

    Microsoft+.NET+Framework+4.0@270027_29496.exe

    微软公司开发的移动应用架构平台。使用该架构,不仅能够在智能手机等高级移动终端上使用Web服务,而且全世界数百万Visual Studio NET开发人员能够轻松地在Pocket PC OS上开发移动应用程序。

    基于LM-BP神经网络的采摘机器人智能运动策略研究.pdf

    此外,文中还提到了一些编程语言和开发环境,例如Matlab、Visual C++、Mirosoft C#等,这些工具的使用对于实现机器人智能运动控制策略的模拟、调试和部署是必不可少的。文档中出现的DOI、A1003-188X等参考信息,反映...

    Microsoft.UI.Xaml.2.6

    《Microsoft.UI.Xaml.2.6:解锁Windows 11安卓子系统的关键组件》 在现代技术日新月异的今天,微软不断推出新的技术创新来满足用户需求。其中一个引人注目的举措是微软应用商店(Microsoft Store)对应用程序大小...

    PDF虚拟打印机WIN7版本.zip

    PDF虚拟打印机技术是一种在计算机操作系统中模拟真实打印机的功能,它允许用户将任何可打印文档转换为PDF(Portable Document Format)格式。在Windows 7系统中,Microsoft提供了一种名为"Microsoft Print to PDF"的...

    MSFS2020-liver-manager:官方的MSFS2020 Livery Megapack Manager。 选择要安装的配件,并保持所有配件更新

    Liveries Mega Pack Manager 飞行模拟器2020的易于使用的涂装管理器。用法加入官方Liveries Mega Pack Discord服务器: ://discord.gg/megapack 下载最新的管理器版本: : 按照说明完成设置。安装配件前往“可用的...

    text-to-speech:文字转语音,语音合成,tts,让Matlab说话-matlab开发

    TTS 文本到语音。 TTS (TXT) 从字符串 TXT 合成语音,然后说出来。 音频格式默认为单声道、16 位、... 此功能需要 Mirosoft Win32 Speech API (SAPI)。 例子: % 朗读课文; tts('我会说话。'); % 列出可用的声音; t

    叫号speaker

    在这个场景中,"mirosoft"可能是与该系统相关的软件开发商,暗示了可能使用了微软的技术或平台。 一、叫号Speaker硬件设备: 叫号Speaker硬件通常是小型化的音频播放设备,它们连接到叫号系统,接收来自服务器的...

    OrdersManagementSystem:项目演示了WPF应用程序中Prism组成库,Material设计库,SQL Server,实体框架的用法

    订单管理系统 先决条件: Microsoft SQL Server 2012 Express Edition或更高版本,并... 报告Mirosoft RDLC + Syncfusion Report Viewer 订单搜索Reactive Extensions for .NET 部署- Click Once on Microsoft Azure

Global site tag (gtag.js) - Google Analytics