`
iseesea
  • 浏览: 46238 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

java面试题:火星探测器。

阅读更多
前几天收到某公司的面试测试题,自己是做完了。。。但是,。。。。没有得到回复。。。估计是被刷了。。。不过没啥,自己也算是经历过,主要考察面向对象的思想吧;如果有人有更好的方法的话希望可以讨论一下,~~~我发现javaeye上面居然已经有了。。。。。。
引用

一小队机器人探测器将由NASA送上火星高原,探测器将在这个奇特的矩形高原上行驶。     用它们携带的照相机将周围的全景地势图发回到地球。每个探测器的方向和位置将由一个x,y系坐标图和一个表示地理方向的字母表示出来。为了方便导航,平原将被划分为网格状。位置坐标示例:0,0,N,表示探测器在坐标图的左下角,且面朝北方。为控制探测器,NASA会传送一串简单的字母。可能传送的字母为:'L','R'和'M'。   'L',和'R'分别表示使探测器向左、向右旋转90度,但不离开他所在地点。'M'   表示向前开进一个网格的距离,且保持方向不变。假设以广场(高原)的直北方向为y轴的指向。     输入:首先输入的line是坐标图的右上方,假定左下方顶点的坐标为0,0。剩下的要输入的是被分布好的探测器的信息。每个探测器需要输入wo   lines。第一条line   提供探测器的位置,第二条是关于这个探测器怎样进行高原探测的一系列说明。位置是由两个整数和一个区分方向的字母组成,对应了探测器的(x,y)坐标和方向。每个探测器的移动将按序完成,即后一个探测器不能在前一个探测器完成移动之前开始移动。     输出:每个探测器的输出应该为它行进到的最终位置坐标和方向。输入和输出   测试如下:        
  期待的输入:
5   5   
1   2   N
LMLMLMLMM  
3   3   E  
MMRMMRMRRM  
期待的输出    
1   3   N  
5   1   E
尽量少用if...else和switch.



坐标:Position.java
/*
 * To change this template, choose Tools | Templates

 * and open the template in the editor.
 */
//���
package mars;

/**
 *
 * @author Allen
 */
public class Position {

    private int x;
    private int y;


    public Position(String x,String y){
    	this.x = Integer.parseInt(x);
    	this.y = Integer.parseInt(y);
    }
       
    public void setX(int _x) {
        this.x = _x;
    }

    public int getX() {
        return this.x;
    }

    public void setY(int _y) {
        this.y = _y;
    }

    public int getY() {
        return this.y;
    }

	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
}



方向Direction.java,之所以把移动和转向单独拿出来,是觉得这个东西是共性,比如你面向东方,那你左转一定是北方等等,之类的共性拿出来当一个小类。对于面向对象来说呢,这个就可以理解成探测器上面的方向控制器,喔~只要一个命令,就会计算好移动或者转向之后的位置,然后机器人在移动过去。。。有没有不同理解的?
//方向控制器,控制转向和移动。
package mars;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Direction {

	private static Direction instance;

	private static ArrayList<Character> index = new ArrayList<Character>();
    	
	private static Map<Character, Integer> direction = new HashMap<Character, Integer>();
	    
    public Direction(){
    	index.add('N');
    	index.add('E');
    	index.add('S');
    	index.add('W');
        direction.put('N', 1);
        direction.put('E', 1);
        direction.put('S', -1);
        direction.put('W', -1);	
    }
	
	public static Direction getInstance(){
		if (instance == null){
 		 	instance = new Direction();
 	    }	
		return instance;
	}
 
	public char turnTo(char faceTo,String LR){
		String lr = LR.toUpperCase();
		int count = (lr.equals("L") ? -1 : 1 );
		char new_faceTo = index.get((index.indexOf(faceTo) + count + 4)%4);
		return new_faceTo;
	}
	
	public Position moveXY(char faceTo,Position pos){
		if(index.indexOf(faceTo)%2 == 1){
			pos.setX(pos.getX()+direction.get(faceTo)<=0 ? 0 : pos.getX()+direction.get(faceTo) );
		}else{
			pos.setY(pos.getY()+direction.get(faceTo)<=0 ? 0 : pos.getY()+direction.get(faceTo));
		}
		return pos;
	}
	
}



探测器Detector.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mars;
/**
 *
 * @author Allen
 */
public class Detector {
    private Position pos;
    private char faceTo;
    private String moveCmd;
    
    public Detector(char faceTo,Position pos,String cmd){
    	this.pos = pos;
    	this.faceTo = faceTo;
    	this.moveCmd = cmd;
    }


    public void excuteCMD(Direction d){
    	String cmd =  this.getMoveCmd(); 
    	char[] cmd_array = cmd.toUpperCase().toCharArray(); 
    	
    	for(int i=0;i<cmd_array.length;i++){
    		System.out.print("\n");
    		
    		if(cmd_array[i]=='M'){
    			this.pos = d.moveXY(this.faceTo, this.pos);    			
    		}else{
    			this.faceTo = d.turnTo(this.faceTo, String.valueOf(cmd_array[i]));
    		}	
    	}
    }
        
    @Override
	public String toString() {
		return "Detector [Position: " + pos + ", faceTo: " + faceTo + ", Moving CMD: "
				+ moveCmd + "]\n";
	}


	public String getMoveCmd() {
		return moveCmd;
	}


	public void setMoveCmd(String moveCmd) {
		this.moveCmd = moveCmd;
	}


	public char getFaceTo() {
		return faceTo;
	}

	public void setFaceTo(char faceTo) {
		this.faceTo = faceTo;
	}

	public void setPos(Position _pos){
        this.pos = _pos;
    }

    public Position getPos(){
        return this.pos;
    }

    

}



程序入口Main.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mars;

import java.util.*;

/**
 *
 * @author Allen
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    	
    	//第一次使用Juint   	
    	//获取方向控制器,单例
    	Direction d = Direction.getInstance();
    	//命令接收
    	List<String> cmd = new ArrayList<String>();
    	//探测器组
    	List<Detector> det = new ArrayList<Detector>();
    	
    	Scanner sc = new Scanner(System.in);
        System.out.print("输入‘exit’退出:\n");
        String str = sc.nextLine();
     	while (!str.toUpperCase().equals("EXIT")) {
        	cmd.add(str);
            str = sc.nextLine();
        }
     	//验证命令,看是否数目准确;
       if(cmd.size()%2!=1){
    	   System.out.print("请输入正确的命令数量。");
       }
	   String[] maxXY = cmd.get(0).split(" ");
	   Position  maxPos = new Position(maxXY[0].trim(),maxXY[1].trim());
       //初始化探测器,并让他执行命令
       for(int i=1;i<cmd.size();i+=2){
    	   String[] tmp = cmd.get(i).split(" ");
    	   Detector det_tmp = new Detector(tmp[2].toUpperCase().charAt(0),new Position(tmp[0],tmp[1]),cmd.get(i+1));
    	   //控制器初始化之后运行。
    	   det_tmp.excuteCMD(d);
    	   //防止越界,理论上是应该放在方向类中,但是这是后面添加的,所以没有去该,这个不符合面向对象的思想。。。
    	   det_tmp.getPos().setX(det_tmp.getPos().getX() <= maxPos.getX() ? det_tmp.getPos().getX() : maxPos.getX());
    	   det_tmp.getPos().setY(det_tmp.getPos().getY() <= maxPos.getY() ? det_tmp.getPos().getY() : maxPos.getY());
    	   det.add(det_tmp);
       }
       
//      输出探测器信息;
       for(int i=0;i<det.size();i++){
    	   System.out.print(det.get(i));   
       }
    }
}



呵呵,第一次接触到比较正规的测试题,做这种题目才有兴趣~~~





2
0
分享到:
评论
2 楼 iseesea 2011-01-07  
是啊~~角度控制方向更好理解~~~~谢谢~!

其中的
private static Map<Character, Integer> direction = new HashMap<Character, Integer>();

我是为了在代码中不是用switch,case的代码
1 楼 CoderDream 2011-01-07  
改造了一下Direction,用List意思不是很明确,用角度表示方向应该更容易理解!

package mars;

import java.util.HashMap;
import java.util.Map;

public class Direction {
	private static Direction instance;
	private static Map<Character, Integer> directions = new HashMap<Character, Integer>();
	private static Map<Integer, Character> degrees = new HashMap<Integer, Character>();

	public Direction() {
		directions.put('E', 0);
		directions.put('N', 90);
		directions.put('W', 180);
		directions.put('S', 270);
		degrees.put(0, 'E');
		degrees.put(90, 'N');
		degrees.put(180, 'W');
		degrees.put(270, 'S');
	}

	public static Direction getInstance() {
		if (null == instance) {
			instance = new Direction();
		}
		return instance;
	}

	public char turnTo(char faceTo, String direction) {
		String lr = direction.toUpperCase();
		int count = (lr.equals("L") ? -1 : 1);

		int faceToDegree = directions.get(faceTo);
		switch (count) {
		case -1:
			faceToDegree += 90;
			break;
		case 1:
			faceToDegree -= 90;
			break;
		}

		faceToDegree = faceToDegree >= 0 ? faceToDegree : faceToDegree + 360;
		faceToDegree = faceToDegree >= 360 ? faceToDegree - 360 : faceToDegree;

		return degrees.get(faceToDegree);
	}

	public Position moveXY(char faceTo, Position position) {

		int degree = directions.get(faceTo);
		int x = position.getX();
		int y = position.getY();
		switch (degree) {
		case 0:
			x += 1;
			break;
		case 90:
			y += 1;
			break;
		case 180:
			x -= 1;
			break;
		case 270:
			y -= 1;
			break;
		default:
			break;
		}
		position.setX(x);
		position.setY(y);

		return position;
	}

	public static void main(String[] args) {
		Direction d = Direction.getInstance();
		System.out.println(d.turnTo('W', "L"));
	}

}

相关推荐

    Java面试题:Java基础方面的题型

    Java面试题:Java基础方面的题型,包括问题和答案哦

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题80:java访问redis级redis集群?.mp4 │ Java面试题81:微信公众号分类和微信开发原理.mp4 │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java...

    计算机和JAVA 面试题大全

    【计算机和JAVA 面试题大全】 在计算机科学与技术领域,尤其是软件开发行业,Java是一种广泛应用的编程语言,以其跨平台、面向对象和高效性而受到赞誉。本资料集涵盖了丰富的Java面试题,旨在帮助求职者准备Java...

    Java面试题:基础篇、编程篇、编程篇、数据库

    常见的java面试题,包括: JAVA面试题集基础篇.pdf JAVA面试题集编程篇.pdf JAVA面试题集高级篇.pdf 就业面试题库(数据库).pdf 数据库.pdf

    10万字总结java面试题和答案(八股文之一)Java面试题指南

    JavaOOP面试题 Java集合/泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 ...

    面试通关:史上最全的Java面试题合集文件大小92M包含56个pdf.zip

    1、01Java面试题、面经.pdf 2、 并发编程面试专题.pdf 3、 并发面试题.pdf 4、 多线程,高并发.pdf 5、 多线程面试59题(含答案).pdf 6、 集合框架.pdf 7、 面试必备之乐观锁与悲观锁.pdf 8、 设计模式面试专题.pdf...

    java面试题集锦 java面试题集锦

    以下是对标题和描述中涉及的一些常见Java面试题的详细解释: 1. **JDK 和 JRE 的区别** JDK(Java Development Kit)是用于开发和调试Java程序的完整工具集,包括JRE(Java Runtime Environment)、编译器(javac...

    java面试题,J2EE面试题 笔试题

    最全的j2EE面试题,题量大、经典,是我面试的整理试题 1、java笔试题大集合 2、各个公司面试题 3、J2EE初学者面试题 4、J2EE面试题(打码查错题) 5、java_华为笔试题 ...15、张孝祥整理Java就业面试题大全

    最新各大公司企业真实面试题-Java面试题

    "Java 面试题及其答案.doc"和"JAVA面试题.doc"提供了大量的面试题及解答,涵盖了从基础知识到高级特性的广泛范围,包括反射、注解、设计模式、Spring框架、数据库操作等。通过这些题目,求职者可以自我评估,了解...

    Java常见的面试试题及详解 Java面试试题:选择合适的数据库引擎 超清(720P).qlv

    《可伸缩服务架构:框架与中间件》

    牛客大数据面试题集锦+答案,共523道,46W+字。大厂必备

    以后会慢慢把Java相关的面试题、计算机网络等都加进来,其实这不仅仅是一份面试题,更是一份面试参考,让你熟悉面试题各种提问情况,当然,项目部分,就只能看自己了,毕竟每个人简历、实习、项目等都不一样。面试题...

    2017java面试题

    "2017java面试题"这个压缩包文件提供了丰富的资源,帮助Java开发者准备面试,深化对Java开发的理解。 文档"Java面试宝典2017.doc"可能包含了以下核心Java知识点: 1. **基础语法**:这包括变量、数据类型、运算符...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    附有面试讲解视频,不是网盘,下载既有视频,屡试不爽的面试宝典。 Java面试题01.面试的整体流程 Java面试题02.java的垮平台原理 Java面试题03....Java面试题04.java中...Java面试题80:java访问redis级redis集群 ......

    资深工程师整理面试题:Java

    答:Java 中的事件机制是指监听器模式。事件源是发生事件的地方,事件监听器是响应事件的对象。事件源和事件监听器之间通过事件对象进行交互。 5. EJB 与 JavaBean 的区别 答:EJB(Enterprise JavaBean)是 Sun ...

    java面试题整理

    java面试题整理java面试题整理java面试题整理java面试题整理java面试题整理java面试题整理java面试题整理java面试题整理

    2024java面试题最全的Java面试题.zip

    2024java面试题2024java面试题最全的Java面试题.zip2024java面试题最全的Java面试题.zip2024java面试题最全的Java面试题.zip2024java面试题最全的Java面试题.zip2024java面试题最全的Java面试题.zip2024java面试题最...

    2023最新JAVA面试题集

    2023年最新版--Java+最常见的+200++面试题汇总+答案总结汇总 阿里百度美团面试题合集 大数据面试题 100道 多线程面试59题(含答案) 最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 ...

    2023java八股文高频面试题

    这份资源是一份2023年Java面试题集,适用于准备Java开发岗位面试的人员。本资源收集了大量的Java面试题,旨在帮助读者熟悉Java编程语言以及相关的编程技术和知识点,从而在面试中更好地展现自己的能力和潜力。本资源...

    汇丰软件java面试题

    "汇丰软件Java面试题详解" 汇丰软件Java面试题是许多IT行业新人的梦寐以求的岗位,需要考生具备扎实的Java基础知识和良好的编程能力。以下是对汇丰软件Java面试题的详细解析。 笔试部分 笔试部分主要包含三部分:...

    java面试题总结资料

    这份"java面试题总结资料"涵盖了多个Java核心领域的关键知识点,包括但不限于: 1. **基础语法**:理解基本的数据类型(如整型、浮点型、字符型和布尔型),变量的声明与使用,以及运算符的优先级。同时,要熟悉...

Global site tag (gtag.js) - Google Analytics