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.逗号分开,数字组成的字符串,拆开。


可以单独用String处理,另外一种方法,原来还有StringTokenizer这个类的存在。

public class TestStringTokenizer {
    public static void main(String[] args) {
        String source = "1,2,3,4,67,3,43,22";
        StringTokenizer token = new StringTokenizer(source,",");
        System.out.println(token.countTokens());
        String[] result = new String[token.countTokens()];
        int i=0;
        while(token.hasMoreTokens()){
            result[i] = token.nextToken();
            i++;
        }
         for(String j:result){
             System.out.println(j);
         }
}
通过传入的逗号,这个类可以像iterator一样,跳过逗号,将逗号前后的字符串一个一个输出。


3.迷宫问题


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

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


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,迷宫,笔试)