用友软件的两道笔试题(找最大文件和倒水问题)

题目比较基础,不是很难,但也有很多需要注意的地方,先看题目吧:

1.找出目录中最大的文件。(目录中可能会有子目录)

2.有两个大小分别为m,nL的容器,如何获得xL的水?

package others;
import java.io.File;
import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//找出目录中最大的文件
public class FileManager {
	Map<String,Long> fileMap=new HashMap();//保存文件的路径及对应的文件大小 	
	public void getMaxSizeFile(String path){	
		File file=new File(path);
		if(file.isDirectory()){
			bianli(file);//通过遍历把文件路径及对应大小保存到fileMap中
		}else System.out.println("the path should be a directory!");
		
		Long maxSize=0L;//文件最大值
		List result=new ArrayList();//保存结果 ,最大的文件可能不止一个
		for(Iterator it=fileMap.entrySet().iterator();it.hasNext();){
			Entry en=(Entry) it.next();
			Long size=(Long) en.getValue();
			if(size>=maxSize){
				if(size!=maxSize)result.clear();;
				maxSize=size;
				result.add(en.getKey());
			}
		}
		for(Iterator it=result.iterator();it.hasNext();)
			System.out.println(it.next());
	}	

	private void bianli(File file) {
		// TODO Auto-generated method stub
		File[] files=file.listFiles();
		if(files==null)return;		
		for(File f:files){
			if(f.isDirectory())bianli(f);
			else {				
				fileMap.put(f.getAbsolutePath(), f.length());
			}
		
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileManager manager=new FileManager();
		long start=System.currentTimeMillis();
		manager.getMaxSizeFile("C:\\");
		System.out.println("花费:"+(System.currentTimeMillis()-start));
	}
}

 

第一种思路是用一个map先把所有的文件名和大小保存起来,再从中找最大值,写的过程中就想到可以不用map,直接用一个中间变量保存最大值,效率会高些。但最后测试的结果表示,效率并没提高多少,当然空间肯定是节省了。

package others;
import java.io.File;
import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//找出目录中最大的文件
public class FileManager2 {
	Long max=0L;
	ArrayList result=new ArrayList();
	
	public void getMaxSizeFile(String path){	
		File file=new File(path);
		if(file.isDirectory()){
			bianli(file);//通过遍历把文件路径及对应大小保存到fileMap中
		}else System.out.println("the path should be a directory!");		
		for(Iterator it=result.iterator();it.hasNext();)
			System.out.println(it.next());
	}	

	private void bianli(File file) {
		// TODO Auto-generated method stub
		File[] files=file.listFiles();
		if(files==null)return;	
		for(File f:files){
			if(f.isDirectory())bianli(f);
			else {				
				if(f.length()>max){
					max=f.length();
					result.clear();
					result.add(f.getAbsolutePath());
				}else if(f.length()==max)result.add(f.getAbsolutePath());
			}
		
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileManager manager=new FileManager();
		long start=System.currentTimeMillis();
		manager.getMaxSizeFile("C:\\");
		System.out.println("花费:"+(System.currentTimeMillis()-start));
	}

}

 

第二题有很多需要注意的地方,可以看注释

 

package others;

/**
 * 有两个大小分别为m,nL的容器,如何获得xL的水? 如4,3 2 
 */
public class WaterTest {

	private int i=1;//倒水次数记数	

	public  boolean doWater(int m, int n, int x) {
		int left, right;
		if (x > m + n || (m == n && m != x)) {
			System.out.println("can't get " + x + "L water");
			return false;
		}
		left = m;// M杯剩余水量
		System.out.println(i+++":M杯倒满:" + m + "L水");
		if (left == x)
			return true;
		right = n;// N杯空余空间
		while (right > 0) {			
			left = m - right;// 左边还剩多少水
			System.out.println(i+++":从M杯倒" + right + "L水到N杯中,最后M杯中剩" + left + "L水");
			if (left == x)
				return true;

			while (left > right) {
				System.out.println(i+++":把N杯中的水全问倒掉");
				right = n;
				System.out.println(i+++":把M杯中剩下的" + left + "L水倒满N杯,M杯中还剩余水"
						+ (left - n) + "L");
				left = left - n;
				if (left == x)
					return true;
			}

			System.out.println(i+++":把N杯中的水全问倒掉");
			right = n - left;
			System.out.println(i+++":把M杯中剩下的" + left + "L水倒到N杯中,N杯剩余空间" + right
					+ "L");
			left = m;
			System.out.println(i+++":M杯倒满:"+m+"L水");
			// right=left<right?n-left:left-n;//右边还剩多少空间

			if (n == (right + x))
				return true;
		}
		return false;
	}
	
	public static void main(String[] args) {
		// 10,4,3 false
		// 4,3,2 true
		// 20,3,2 true
		//20,7,5 true
		WaterTest test=new WaterTest();
		if (test.doWater(20,7,5)) {
			System.out.println("胜利完成!");
		} else
			System.out.println("不能实现!");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值