今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】

来源:互联网 发布:linux服务器配置ipv6 编辑:程序博客网 时间:2024/05/16 12:05

编程题

题目1:(回溯法)

  • 【题目描述】给定一个矩阵,从某点出发,找到箱子,然后把箱子推到目的地。计算最少使用多少步。无法到达用-1表示。

public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String str = in.nextLine();String[] data = str.split(" ");int n = Integer.valueOf(data[0]);int m = Integer.valueOf(data[1]);List<String> strList = new ArrayList(n);for(int i = 0 ; i < n; i++){strList.add(in.nextLine());}//转化为字符矩阵。char[][] matrix = getMatrix(strList, n, m);//发现各自的位置int startX = -1,startY = -1;int boxX = -1,boxY = -1;int targetX = -1,targetY = -1;for(int i =0;i < n;i++){for(int j =0;j < m;j++){if(matrix[i][j]=='S'){startX = i;startY = j;}else if(matrix[i][j]=='0'){boxX = i;boxY = j;}else if(matrix[i][j]=='E'){targetX = i;targetY = j;}}}//出发到找到箱子最小。int findBox = getMinSteps(matrix,startX, startY, boxX, boxY, n, m);if(findBox == -1){System.out.println(-1);}else{//从箱子到目的地最小化。int findTarget = getMinSteps(matrix,boxX, boxY, targetX, targetY, n, m);if(findTarget == -1){System.out.println(-1);}else{System.out.println(findBox + findTarget +1);}}}public static char[][] getMatrix(List<String> data,int n ,int m){char[][] result  = new char[n][m];for(int i = 0; i < n ; i++){for(int j = 0; j < m ;j ++){result[i][j] = data.get(i).charAt(j);}}return result;}public static int getMinSteps(char[][] matrix,int startX,int startY,int endX,int endY,int n,int m){if(startX < 0 || startY < 0 || startX >= n || startY >= m || matrix[startX][startY]== '#' || matrix[startX][startY] == 'V'){return -1;}if(startX == endX  && startY == endY){return 0;}int ways[] = new int[4];char preState = matrix[startX][startY];matrix[startX][startY] = 'V';//表示已访问ways[0] = getMinSteps(matrix,startX +1,startY,endX,endY,n, m);ways[1] = getMinSteps(matrix ,startX -1, startY, endX, endY, n, m);ways[2] = getMinSteps(matrix,startX, startY+1, endX, endY, n, m);ways[3] = getMinSteps(matrix,startX, startY-1, endX, endY, n, m);matrix[startX][startY] = preState;int result = Integer.MAX_VALUE;for(int i = 0; i < 4;i++){if(ways[i] >= 0 && result > ways[i]){result = ways[i];}}return result == Integer.MAX_VALUE ? -1 : result+1;}}


题目2:(发现数字规律)

  • 【题意】有n个房间,i 号 房间里的人取出,然后重新分配,分配规则:让 i 号房间中的人全部出来,接下来按照 i + 1,i + 2, i + 3...进行分配,直到所有的人都分配完毕。n 号 房间的 下一个房间是 1 号房间。现在给出分配完后的每个房间的人以及最后一个人被分配的房间x,求出分配前每个房间的人数。
  • 【技巧】 在纸上运行一个简单的例子,人脑分析,通过这个过程就能够发现一些规律。(最初的状态,能进行区分的状态,可以作为还原终止的场景)

 public class Main2 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int x = in.nextInt();int[] people = new int[n + 1];for (int i = 1; i <= n; i++) {people[i] = in.nextInt();}findOrigin(n, x, people);}public static void findOrigin(int n, int x, int[] people) {int count = 0;int i = x;while (true) {//到达0时说明,该处数据被清空了,用来填补之前的数据。(符合逻辑,题目的规则)if (people[i] == 0) {break;}people[i]--;count++;i = (i - 1 + n) % n == 0 ? n : (i - 1 + n) % n; // 向后退位。}people[i] = count;for (int j = 1; j <= n; j++) {if (j == 1) {System.out.print(people[j]);} else {System.out.print(" " + people[j]);}}}}


原创粉丝点击