java笔试题解析

1.数组乱序

天天搞排序,今天遇到一道乱序的问题居然无从下手,知道random,然后想了很复杂的if条件判断。

其实,只要在数组里面依次拿出一个数,然后产生数组长度范围内的一个数作为下标,然后互换即可!

public class RandomNumber {
    public static void main(String[] args) {
        int change = 6;
        int[] sequence = new int[change];
        for (int i = 0; i < change; i++) {
            sequence[i] = i;
        }
        Random random = new Random();
        for (int i = 0; i < change; i++) {
            int j = random.nextInt(change);
            int tmp = sequence[i];
            sequence[i] = sequence[j];
            sequence[j] = tmp;
        }
        for (int k : sequence) {
            System.out.println(k);
        }
    }
}

2.迷宫问题

对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更愿意使用“紧贴墙壁,靠右行走”的简单规则。

下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。

package newExam;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Maze {
    class Cell {
        private int row;
        private int col;
        private Cell from;

        public Cell(int row, int col, Cell from) {
            this.row = row;
            this.col = col;
            this.from = from;
        }
    }

    char[][] maze = {
            { ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘B‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘ },
            { ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘ },
            { ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘.‘, ‘#‘ },
            { ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘.‘, ‘A‘ },
            { ‘#‘, ‘#‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘, ‘.‘, ‘.‘, ‘.‘, ‘#‘, ‘#‘, ‘#‘ },
            { ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘, ‘#‘ } };

    // 打印整个迷宫
    public void show() {
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++)
                System.out.print(" " + maze[i][j]);
                System.out.println();
        }
    }

    public Cell colorCell(Set<Cell> from, Set<Cell> dest) {
        Iterator<Cell> it = from.iterator();
        while (it.hasNext()) {
            Cell a = it.next();
            Cell[] c = new Cell[4];
            c[0] = new Cell(a.row - 1, a.col, a);
            c[1] = new Cell(a.row, a.col - 1, a);
            c[2] = new Cell(a.row + 1, a.col, a);
            c[3] = new Cell(a.row, a.col + 1, a);

            for (int i = 0; i < 4; i++) {
                if (c[i].row < 0 || c[i].row >= maze.length)
                    continue;
                if (c[i].col < 0 || c[i].col >= maze[0].length)
                    continue;

                char x = maze[c[i].row][c[i].col];
                if (x == ‘B‘)
                    return a;
                if (x == ‘.‘) {
                    maze[c[i].row][c[i].col] = ‘?‘;
                    dest.add(c[i]);//代码填空处
                }
            }
        }
        return null;
    }

    public void resolve() {
        Set<Cell> set = new HashSet<Cell>();
        set.add(new Cell(9, 11, null));

        for (;;) {
            Set<Cell> set1 = new HashSet<Cell>();
            Cell a = colorCell(set, set1);
            if (a != null) {
                System.out.println("找到解!");
                while (a != null) {
                    maze[a.row][a.col] = ‘+‘;
                    a = a.from;// 代码填空处
                }
                break;
            }
            if (set1.isEmpty()) {
                System.out.println("无解!");
                break;
            }
            set = set1;
        }
    }

    public static void main(String[] args) {
        Maze m = new Maze();
        m.show();
        m.resolve();
        m.show();
    }
}

有两个填空的地方,从resolve方法 后面set=set1 可以知道,colorCell(Set<Cell> from, Set<Cell> dest)方法里并没有任何关于dest的赋值,那肯定缺一条关于dest的语句,还有from从头到尾都没用过,所以也是要填的。

整个的思路是,#是墙壁,点是路,调用resolve方法,从A出发,然后以A作为from(from可看成出发的起点),搜索上下左右的四个cell,遇到“.”就把他变为“?”,同时存入Set dest中,这样一直循环,那么所有的路都会成为“?”, 那最终找到B出口后,再一步步回溯,B的from是谁,是B下面那个点,B的下面那个点是哪里来的,是再下面那个,如果此时a为null了,那证明没有路了,无解,如果有,最后还是回到A这个点,回溯的同时,

maze[a.row][a.col] = ‘+‘ 标记了路线符号,这样就找到路线图了。

java笔试题解析

时间: 2024-10-02 10:08:07

java笔试题解析的相关文章

Java笔试题解析(二)——2015届唯品会校招

曾经总是看别人写的笔经面经.今天自己最终能够写自己亲身经历的一篇了 T-T. 前阵子去了唯品会的秋招宣讲会,华工场(如今才知道原来找家互联网公司工作的人好多).副总裁介绍了VIP的商业模式是逛街式的购物,与京东和淘宝不同. 宣讲会之后还没有笔试.网上找了一些曾经的题目,当练练手. 2014校招的. 1.下列不可作为java语言修饰符的是(D) A. a1 B. $1 C. _1 D. 11 这题目有问题,修饰符是public这些,不能作为变量名才对. 2.整形数据类型中.须要内存空间最少的是(D

Java笔试题解析(二)——2015年唯品会校招

以前总是看别人写的笔经面经,今天自己终于可以写自己亲身经历的一篇了 T-T. 前阵子去了唯品会的秋招宣讲会,华工场(现在才知道原来找家互联网公司工作的人好多),副总裁介绍了VIP的商业模式是逛街式的购物,与京东和淘宝不同.宣讲会之后还没有笔试.网上找了一些以前的题目,当练练手. 2014校招的. 1.下列不可作为java语言修饰符的是(D) A. a1 B. $1 C. _1 D. 11 这题目有问题,修饰符是public这些,不能作为变量名才对. 2.整形数据类型中,需要内存空间最少的是(D)

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

精选30道Java笔试题解答

个人觉得整理的超级好的Java笔试题,原文请见 http://blog.csdn.net/lanxuezaipiao/article/details/16753743 1. 下面哪些是Thread类的方法() A start()       B run()       C exit()       D getPriority() 答案:ABD 解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System类的方

Java笔试题1

1. 下面的代码运行后,将输出什么结果? String s1 = new String("Test"); String s2 = new String("Test"); if (s1 == s2) System.out.println("Same"); if (s1.equals(s2)) System.out.println("Equals"); A. Same     Equals  B.Same   C. Equals

java笔试题(1)

char型变量中能不能存贮一个中文汉字? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字.补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节. "=="和equals方法有什么区别? (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时

java笔试题(3)

short a = 1; a = a + 1; 有错吗? short a = 1; a += 1; 有错吗? 对于short a = 1; a = a + 1;由于a + 1 运算时会自动提升表达式的类型,所以结果是int型,再复制short类型a时,编译器将报告需要强制装换类型的错误. 对于short a = 1; a += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译. 静态变量和实例变量的区别? 在语法定义上的区别:静态变量前要加stati

java笔试题(4)

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? abstract的method 不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系! abstract的method 不可以是native的,native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用.例如,FileOutputSteam类要硬件打交道,底层的

java笔试题(2)

简述构造器的运行机制 首先要注意的是的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因. 构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象.同步.静态等等访问限制以外的形式. 因为构造器不是函数,所以它是没有返回值的,也不允许有返回值.但是这里要说明一下,构造器中允许存在