今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】
2017-10-17 22:36
435 查看
编程题
题目1:(回溯法)
【题目描述】给定一个矩阵,从某点出发,找到箱子,然后把箱子推到目的地。计算最少使用多少步。无法到达用-1表示。
题目2:(发现数字规律)
【题意】有n个房间,i 号 房间里的人取出,然后重新分配,分配规则:让 i 号房间中的人全部出来,接下来按照 i + 1,i + 2, i + 3...进行分配,直到所有的人都分配完毕。n 号 房间的 下一个房间是 1 号房间。现在给出分配完后的每个房间的人以及最后一个人被分配的房间x,求出分配前每个房间的人数。
【技巧】 在纸上运行一个简单的例子,人脑分析,通过这个过程就能够发现一些规律。(最初的状态,能进行区分的状态,可以作为还原终止的场景)
题目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 [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]); } } } }
相关文章推荐
- 2017.04.19:今日头条数据分析笔试01
- 今日头条2017暑期实习生招聘笔试编程题之函数最宽尖峰
- 今日头条2018春季校园招聘研发岗位笔试编程题1
- 今日头条2018春季校园招聘研发岗位笔试编程题第一、二题
- 今日头条2018春季校园招聘研发岗位笔试编程题2
- Java编程题:今日头条笔试题
- 今日头条2018春季校园招聘研发岗位笔试编程题4
- [置顶] 今日头条笔试编程题
- 今日头条2017后端工程师实习生笔试题
- 2017年4月18日今日头条笔试原题B题
- 今日头条笔试题
- 测试菜鸟在测试过程发现问题并整理的问题分析解决方案
- 今日头条8/23第一道编程题
- 2018今日头条笔试(第二题)
- 【今日头条2017内推笔试题】二维平面整数点集
- 分析AJAX抓取今日头条街拍美图(上)
- 今日头条2018笔试第二题
- 2017.04.19:今日头天数据分析笔试02
- 2018春招-今日头条笔试题-第四题(python)
- 使用python3分析Ajax爬取今日头条上的街拍美图