编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)
最近不时在刷算法题,刷华为OD算法题,有诸多好处:
宿愿用我自己疯狂刷题的劲头,感化大家,让大家爱上刷题,顺利经过华为OD机试,把握更多低劣的算法。
上方这道题,是很经典的深度优先搜查dfs算法+二叉树。把握一道题,知晓一类题,冲吧~
一、标题形容
某文件系统中有N个目录,每个目录都有一个举世无双的ID。每个目录只要一个父目录,但每个父目录下可以有零个或许多个子目录,目录结构呈树状结构。
假定,根目录的ID为0,且根目录没有父目录,其余一切目录的ID用惟一的正整数示意,并一致编号。
现给定目录ID和其父目录ID的对应父子相关表[子目录ID,父目录ID],以及一个待删除的目录ID,请计算并前往一个ID序列,示意由于删除指定目录后剩下的一切目录,前往的ID序列以递增序输入。
留意:
二、输入形容
输入的第一行为父子相关表的长度m;
接上去的m行为m个父子相关对;
最后一行为待删除的ID。序列中的元素以空格宰割。
三、输入形容
输入一个序列,示意由于删除指定目录后,残余的目录ID。
四、深度优先搜查dfs
1、搜查的要点:
假设搜查是以凑近起始形态的程序依次裁减形态的,叫宽度优先搜查。
2、假设裁减是首先裁减新发生的形态,则叫深度优先搜查。
深度优先搜查用一个数组寄存发生的一切形态。
3、深度优先搜查dfs代码架构:
publicintdef(intx,inty,intstep){if(递归进口/到达指标形态){//启动对应操作return0;}for(inti=0;i<n;i++){//遍历剩下的一切的状况if(visit[i]==0){//未访问x=下一步降级;y=下一步降级;visit[i]=1;def(x,y,step);visit[i]=0;//记得回溯恢复}}}
五、解题思绪
依据标题形容,输入数据可以组成一个二叉树,假设将某个节点删除,求残余节点。
输入父子相关表的长度m。
接上去的m行输入父子相关。
输入待删除的ID。
遍历m个父子相关,拼接成二叉树,拼接残余的目录ID。
在残余的父子相关汇合treeList中寻觅父节点是node.left的节点,启动树的再次拼接。
在残余的父子相关汇合treeList中寻觅父节点是node.right的节点,启动树的再次拼接。
输入合乎条件的目录ID。
六、算法源码
publicclassOdTest04{staticNoderootNode=null;staticintremoveValue=0;//残余的目录IDstaticStringBuilderbuilder=newStringBuilder();publicstaticvoidmn(String[]args){Scannersc=newScanner(System.in);//父子相关表的长度mintm=Integer.valueOf(sc.nextLine());//m个父子相关List<int[]>treeList=newArrayList<>();for(inti=0;i<m;i++){int[]treeArr=Arrays.stream(sc.nextLine().split("")).mapToInt(Integer::parseInt).toArray();if(treeArr[1]==0){rootNode=newNode(treeArr[0]);//拼接二叉树根IDbuilder.end(treeArr[0]).append("");continue;}treeList.add(treeArr);}//待删除的IDremoveValue=Integer.valueOf(sc.nextLine());/***遍历m个父子相关,拼接成二叉树,拼接残余的目录ID*/dfs(treeList,rootNode);builder.deleteCharAt(builder.length()-1);//输入合乎条件的目录IDSystem.out.println(builder);}/***深度优先搜查dfs*@paramtreeList*@paramnode*/privatestaticvoiddfs(List<int[]>treeList,Nodenode){/***假设残余的父子相关汇合treeList为0,则不须要再启动dfs*假设要dfs的node节点是null,则不须要再寻觅其左右子节点*/if(treeList.size()==0||node==null){return;}for(inti=0;i<treeList.size();i++){//父子相关int[]treeArr=treeList.get(i);//假设该相关的父节点是valueif(treeArr[1]==node.value){//假设该父节点不是待移除的IDif(removeValue!=node.value){intsonValue=treeArr[0];//假设该子节点不是待移除的IDif(removeValue!=sonValue){//拼接成二叉树if(node.left==null){node.left=newNode(sonValue);}elseif(node.right==null){node.right=newNode(sonValue);}//拼接残余的目录IDbuilder.append(sonValue).append("");}}//移除满足条件的父子相关treeList.remove(treeArr);//父子相关汇合treeList移除某节点,treeList长度-1,下一个坐标i也应该-1i--;}}//在残余的父子相关汇合treeList中寻觅父节点是node.left的节点,启动树的再次拼接dfs(treeList,node.left);//在残余的父子相关汇合treeList中寻觅父节点是node.right的节点,启动树的再次拼接dfs(treeList,node.right);}}
七、成果展现
1、输入
2、输入
3、说明
输入可以组成二叉树:
6485791011
删除值为8的节点,变为6457。
4、兴许很多人会问,假设节点的值相等,怎样办?
5、输入
6、说明
输入可以组成二叉树:
6455551011
删掉值为5的节点,变为64。
对杀毒软件有深度研究的朋友帮帮忙
360肯定不要啊,占的多,还拖累速度,还有过误报,把360浏览器装扮成一个补丁,欺骗了用户,现在360黑匣子出现后就更不会去用了。 而且最新的AV-C评测你也可以去看看金山+腾讯电脑管家不错,他们是合作关系,可以配合使用(腾讯电脑管家单独也可,我用快2年了,一直稳定快速,没中毒)推荐试试腾讯电脑管家,它是免费专业安全软件,杀毒管理二合一(只需要下载一份),占内存小,杀毒好,防护好,无误报误杀。 拥有云查杀引擎、反病毒引擎、金山云查杀引擎、AVIRA查杀引擎、小红伞和查杀修复引擎等世界一流杀毒软件内嵌杀毒引擎!保证杀毒质量在恶意网址和假冒网站上,腾讯可以说是拥有真正意义上全国首位的恶意网址库。 不排除QQ用户的付出。 在网址拦截上,TX和其他相比,TX占优势。 杀毒和防御,TX的引擎多了点,有小红伞撑腰,杀毒能力自然不弱。 用户量居首位的云网络,防御做的很出色。 配合庞大的企鹅网络,推出一些贴合实际的安全。 保护你帐号不说,还帮你游戏加速,QQ升级,还有礼包拿。 占内存又小,运行速度快。 最重要的是别人是免费。 现在出8.3新版了,增加广告过滤、安全沙箱,QQ账号的多维度防护,推荐可以试试哟。 装腾讯的不只是为了QQ加速,如果你深度用上一段时间,你就会发现它的特色。 杀软不是吹的,是真正把用户放在第一位的才是好软件
"0x00780000指令应用的0x00000001内存。该内存不能为written"怎么办啊?
内存出错的故障分析硬件方面:一般来说,内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题,还有就是2个不同牌子不同容量的内存混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。 你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。 假如是双内存,而且是不同品牌的内存条混插或者买了二手内存时,出现这个问题,这时,就要检查是不是内存出问题了或者和其它硬件不兼容。 软件方面:先简单说说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间,就会发生溢出现象。 举个例子:一个桶子只能将一斤的水,当放入两斤的水进入时,就会溢出来。 而系统则是在屏幕上表现出来。 这个问题,经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作,系统为保持稳定,就会出现上述情况。 另外也可能是硬件设备之间的兼容性不好造成的。 几个例子例一:打开IE浏览器或者没过几分钟就会出现0x70dcf39f指令引用的0x000内存。 该内存不能为“read”。 要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。 解决方法:修复或升级IE浏览器,同时打上补丁。 看过其中一个修复方法是,Win2000自升级,也就是Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下。 比如你的IE升级到了6.0,自升级后,会被IE5.0代替。 例二:在windows xp下双击光盘里面的“”文件,显示“0x77f745cc”指令引用的“0x”内存。 该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。 win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\。 右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffff”指令引用的“0xffff”内存。 该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。 例四:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“Oxf6”(每次变化)指令引用的“Oxff”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。 还不行,只好换就用别的播放器试试了。 例五:双击一个游戏的快捷方式,“Ox77f5cdO”指令引用“Oxffff”内存,该内存不能为“read” ,并且提示程序错误。 解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 例六:一个朋友发信息过来,我的电脑便出现了错误信息:“0*772b548f”指令引用的“0*”内存,该内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。 解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 例七:我的笔记本电脑用的XP系统,有时关闭网页时会弹出遇到问题需要关闭,然后有弹出0x03e7c738指令引用的0x03e7c738内存,该内存不能为read,请问是怎么回事?解决方法:先查杀一下病毒,另外如果你安装了浏览增强之类的软件,请卸掉。 例八:从桌面或开始菜单中打开任何一个程序, 出现错误提示:0x....指令引用的0x0000内存,该内存不能为read。 省略号代表可变值。 而从运行中打开程序没问题。 解决方法:运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks下,应该只有一个正常的键值{AEB6717E-7E19-11d0-97EE-00C04FD}, 将其他的删除(默认键值当然不要删除)。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。