分享两道Java面试的算法上机题目(后续会持续补充更多)

所有题目参考答案均是小编自己想法,仅供参考,解法很多,大可不必局限,有更优解的大神无解,可评论或私聊博主指正!

题目1

找大串,给定一个字符串其中包含任意组连续字符,我们把超过3个连续相同字符的组合称作为大串,请找出他们的起止位置。如:“叽叽汪汪汪喵喵喵喵渣渣”可分为“叽叽”、“汪汪汪”、“喵喵喵喵 ”、“喳喳”,其中“汪汪汪”和“喵喵喵喵”为大串组。请根据下面提示代码,给出完整思路代码。

public class test1 {
    public static void main(String[] args) {
        // 期望的输出为 [[2,4]]
        System.out.println(run("这是啊啊啊呀"));
        // 期望的输出为 [[2,4],[5,8]]
        System.out.println(run("叽叽汪汪汪喵喵喵喵喳喳"));
    }
    /**
     * 找出输入字符串中连续3个以上相同字符的起始和结束位置
     * @param input 输入字符串
     */
    private static List> run(String input) {
        // TODO 在这里实现代码
    }
}

参考答案 

import java.util.ArrayList;
import java.util.List;

/**
 * @Author:Yunnuo
 * @Email: [email protected]
 * @Date:2023/8/11 14:14
 * @Description:
 */
public class Test1 {
    public static void main(String[] args) {
        // 期望的输出为 [[2,4]]
        System.out.println(run("这是啊啊啊呀"));
        // 期望的输出为 [[2,4],[5,8]]
        System.out.println(run("叽叽汪汪汪喵喵喵喵喳喳"));
    }
    /**
     * 找出输入字符串中连续3个以上相同字符的起始和结束位置
     * @param input 输入字符串
     */
    private static List> run(String input) {
        List> result = new ArrayList<>();

        int start = 0;
        int end = 0;

        while (end < input.length()) {
            if (input.charAt(start) == input.charAt(end)) {
                end++;
            } else {
                if (end - start >= 3) {
                    List interval = new ArrayList<>();
                    interval.add(start);
                    interval.add(end - 1);
                    result.add(interval);
                }
                start = end;
            }
        }

        // 结束
        if (end - start >= 3) {
            List interval = new ArrayList<>();
            interval.add(start);
            interval.add(end - 1);
            result.add(interval);
        }

        return result;
    }
}

题目2

NASA派出的一个机器人小车分队已经成功着陆火星,出乎意料的是摆在这些小车面前的是一个十分规矩的矩形平原,操作员需要通过远程发送指令序列来控制这些小车移动,在移动的过程中小车上的高清摄像机会将整个平原的地形图完整记录并返回给地球,为了方便导航,我们将平原看成一个二维坐标面,x轴正方向为东,y轴正方向为北,矩形平原的最左下角坐标为(0,0),这样小车的方位便可以使用(x坐标,y坐标,面向方位)来表示,如(0,0,N)表示小车位于平原的左下角并且面向北,操作员可以用指令L,R和M。L和R可以让小车向左或向右旋转90度而不移动,M可以让小车向所面向的方向方位前进一个单位而不改变方向,你需要编写一个程序来计算小车最终的位置与方位,要求用面向对象的思想解决这个问题,你可以参考以下代码片段实现:

public static void main(String[] args) {
        // 控制器
        RoverCoordinator roverCoordinator = new RoverCoordinator();
        // 平面右上角的坐标x
        roverCoordinator.setMaxX(5);
        // 平面右上角的坐标y
        roverCoordinator.setMaxY(5);

        // 第一辆小车的数据
        Rover rover1 = new Rover(1,1,2,"N");
        roverCoordinator.addRover(rover1);

        // 第二辆小车的数据
        Rover rover2 = new Rover(2,3,3,"E");
        roverCoordinator.addRover(rover2);

        // 通过协调器给小车1发指令
        roverCoordinator.action(rover1.getId(),"LMLMLMLMM");
        // 通过协调器给小车2发指令
        roverCoordinator.action(rover2.getId(),"MMRMMRMRRM");

        System.out.println(rover1);
        System.out.println(rover2);

}

public cless Rover {
    /**
     * 小车id
     */
    private int id;
    /**
     * 小车坐标x值
     */
    private int x;
    /**
     * 小车坐标y值
     */
    private int y;
    /**
     * 小车面向方位
     */
    private String direction;
    
    public Rover(int id, int x, int y, String direction) {
        this.id = id;
        this.x = x;
        this.y = y;
        this.direction = direction;
    } 
    
    /**
     * 小车执行单个指令
     * @param command 指令
     */
    public void action(char command) {
        // TODO 你的代码
    }
}

public class RoverCoordinator {
    /**
     * 所有已注册小车
     */
    private Map roverMap;
    /**
     * 地图最大x值
     */
    private int maxX;
    /**
     * 地图最大y值
     */
    private int maxY;

    public RoverCoordinator(){
        roverMap = new HashMap<>();
    }

    public void addRover(Rover rover){
        roverMap.put(rover.getId(),rover);
        checkOutOfRange();
    }

    /**
     * 操控指定的小车完成指令序列,同时检查越界问题
     * @param id 小车ID
     * @param commandSequence 指令序列
     */
    public void action(int id,String commandSequence){
        
    }

    /**
     * 判断小车是否越界
     */
    private void checkOutOfRange() {

    }
        
}


参考答案

RoverCoordinator类

import lombok.Data;

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

/**
 * @Author:Yunnuo
 * @Email: [email protected]
 * @Date:2023/8/11 14:34
 * @Description: 小车协调通器
 */
@Data
public class RoverCoordinator {
    /**
     * 所有已注册小车
     */
    private Map roverMap;
    /**
     * 地图最大x值
     */
    private int maxX;
    /**
     * 地图最大y值
     */
    private int maxY;

    public RoverCoordinator(){
        roverMap = new HashMap<>();
    }

    public void addRover(Rover rover){
        roverMap.put(rover.getId(),rover);
        checkOutOfRange();
    }

    /**
     * 操控指定的小车完成指令序列,同时检查越界问题
     * @param id 小车ID
     * @param commandSequence 指令序列
     */
    public void action(int id,String commandSequence){
        Rover rover = roverMap.get(id);
        if (rover != null) {
            for (char command : commandSequence.toCharArray()) {
                executeCommand(rover, command);
                checkOutOfRange();
            }
        }
    }
    private void executeCommand(Rover rover, char command) {
        if (command == 'L') {
            rover.turnLeft();
        } else if (command == 'R') {
            rover.turnRight();
        } else if (command == 'M') {
            rover.move();
        }
    }

    /**
     * 判断小车是否越界
     */
    private void checkOutOfRange() {
        for (Rover rover : roverMap.values()) {
            if (rover.getX() < 0 || rover.getX() > maxX || rover.getY() < 0 || rover.getY() > maxY) {
                throw new RuntimeException("Rover " + rover.getId() + " 出界了!");
            }
        }
    }
}

Rover类

import lombok.Data;

/**
 * @Author:Yunnuo
 * @Email: [email protected]
 * @Date:2023/8/11 14:33
 * @Description:
 */
@Data
public class Rover {
    /**
     * 小车ID
     */
    private int id;
    /**
     * 小车x坐标
     */
    private int x;
    /**
     * 小车y坐标
     */
    private int y;
    /**
     * 小车面向方位
     */
    private Direction direction;
    public Rover(int id, int x, int y, String direction) {
        this.id = id;
        this.x = x;
        this.y = y;
        this.direction = Direction.valueOf(direction);
    }

    public void turnLeft() {
        switch (direction) {
            case N:
                direction = Direction.W;
                break;
            case E:
                direction = Direction.N;
                break;
            case S:
                direction = Direction.E;
                break;
            case W:
                direction = Direction.S;
                break;
        }
    }

    public void turnRight() {
        switch (direction) {
            case N:
                direction = Direction.E;
                break;
            case E:
                direction = Direction.S;
                break;
            case S:
                direction = Direction.W;
                break;
            case W:
                direction = Direction.N;
                break;
        }
    }
    public void move() {
        switch (direction) {
            case N:
                y++;
                break;
            case E:
                x++;
                break;
            case S:
                y--;
                break;
            case W:
                x--;
                break;
        }
    }

    @Override
    public String toString() {
        return "Rover " + id + ": (" + x + ", " + y + ", " + direction + ")";
    }
}
enum Direction {
    N, E, S, W
}

 

你可能感兴趣的:(Java面试系列,Java进阶,Java,Java面试题)