校招算法篇之遍历目录

篇前话:

今天上午看到一篇文章,沈向洋写的,You are what you write。你就是你所写的(原谅我这蹩脚的翻译)。再一次说明了写文章的重要性。在这个信息爆炸技术丛生的时代,一切都成了快消,作为IT技术人员来讲,不应该淹没在这些花里胡哨的名词当中,而应该稳扎稳打,练好并且坚持一项很重要的技能:Write。写好的文章,分享出去,让全世界的人一起去探讨,你的思想和思路也会在这个过程中得到充分的锻炼,因此,更多的写吧^_^

好的,那么言归正传,还是进入我们的正题。校招面试其实是一个实力加运气的事儿,当然实力是前提,也包括个人状态等等一些因素。运气的因素可能就取决于面试官了。作为面试官来讲,一方面应该了解应聘者目前的能力与岗位需求的匹配情况,另一方面也需要了解应聘者对于相关未知领域的探索精神和探索能力。所以,好的面试官应该是循序渐进,善于引导,尽量挖掘出应聘者的潜在能力。当然,并不是每一个面试官在每一场面试中都能做到很好,都会有疲惫,都会有懈怠,这些因素对于我们来讲是不可控的。唯一可控的就是我们自己。社会不是绝对公平,但我们尽量让它相对公平。

以上有感于面试深圳某手机公司,全程都有点尬聊,当然主要原因是自己比较渣。刚一坐下来,面试官就直接抛出问题了,遍历一个目录下的所有文件,我一想,Python大法好啊,os.wlak()直接就搞定了,

def test1(dir):
	for root,dirs,files in os.walk(dir):
		for f in files:
			print(os.path.join(root,f))
		for d in dirs:
			print(os.path.join(root,d))

但是当时对这个用法记得不是太清,面试官直接就诈我了,是这样吗?这样就可以了?怎么不用递归?这个底层用递归了么?没有给出明确答复,面试官让我再用递归写一遍,好嘛,写了一会了....

def test2(dir):
	for lists in os.listdir(dir):
		path=os.path.join(dir,lists)
		if not os.path.isdir(path):
			print(path)
		else:
			test2(path)

当然,Java写法如下,

	static List<File> traverse(File root){
		ArrayList<File> files=new ArrayList<>();
		listFiles(files,root);
		return files;
	}
	static void listFiles(List<File> list,File dir) {
		File[] files=dir.listFiles();
		for(File f:files) {
			if(f.isFile()) list.add(f);
			else if(f.isDirectory()) listFiles(list, f);
		}
	}

面试官接着问,如果递归的目录太深,几百几千层,会怎样?答曰,会发生栈溢出,那么如何避免递归太深发生栈溢出呢?简而言之就是不用递归的办法来遍历目录,那怎么办呢?反正博主当时没有想出来,后面博主通过查资料也找到了解决办法。目录抽象出来看其实就是一个树型结构,树的遍历有DFS(深度优先搜索),BFS(广度优先搜索),BFS也叫层序遍历。那么DFS类似于递归的方法,此处我们就可以仿照BFS的思路。BFS在横向操作的时候,会将左右子树加入到队列当中(有孩子的前提下),然后再对队列进行遍历。那么遍历目录是同样的思路,从根目录开始,是文件就输出,是目录的话就加入到queue里面,遍历queue直到queue为空,

	static void nottraver(File root) {
		Queue<File> queue=new LinkedList<>(); //queue里全存的是目录
		queue.add(root);
		while(!queue.isEmpty()) {
			File fi=queue.poll();
			File[] files=fi.listFiles();
			for(File f:files) {
				if(f.isFile()) System.out.println(f.toString());
				else if(f.isDirectory()) queue.add(f);
			}
		}
	}
这个时候就再不用担心栈溢出了!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值