小红书笔试:倒卖战利品求代码。附:另外3题代码

最后1题“倒卖战利品”没来得及做,有人写出来了吗?附上前3道:
1. 棋盘最短路径(100%)
import java.util.Arrays;
import java.util.Scanner;

public class 棋盘最短路径 {
	public static int min = Integer.MAX_VALUE;
	public static boolean find = false;
	public static void main( String[] args ) {
		helper();
	}

	private static void helper() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int k = sc.nextInt();
		boolean[][] go = new boolean[n][m];
		boolean[][] visit = new boolean[n][m];
		for(int i=0;i<n;i++) {
			Arrays.fill(go[i], true);
		}
		for(int i=0;i<k;i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			go[a][b] = false;
		}
		findPath(0, 0, 0, visit, go, n - 1, m - 1);
		if(find) {
			System.out.println(min);
		}else {
			System.out.println(0);
		}
	}

	private static void findPath( int row , int col , int s, boolean[][] visit, boolean[][] go, int targetRow, int targetCol ) {
		if(row == targetRow && col == targetCol) {
			find = true;
			if(s < min) {
				min = s;
			}
			return;
		}
		if(col < targetCol && !visit[row][col+1] && go[row][col+1]) { // 右
			visit[row][col+1] = true;
			findPath(row, col + 1, s + 1, visit, go, targetRow, targetCol);
			visit[row][col+1] = false;
		}
		if(row < targetRow && !visit[row+1][col] && go[row+1][col]) { // 下
			visit[row+1][col] = true;
			findPath(row + 1, col, s + 1, visit, go, targetRow, targetCol);
			visit[row+1][col] = false;
		}
		if(col > 0 && !visit[row][col-1] && go[row][col-1]) { // 左
			visit[row][col-1] = true;
			findPath(row, col - 1, s + 1, visit, go, targetRow, targetCol);
			visit[row][col-1] = false;
		}
		if(row > 0 && !visit[row-1][col] && go[row-1][col]) { // 上
			visit[row-1][col] = true;
			findPath(row - 1, col, s + 1, visit, go, targetRow, targetCol);
			visit[row-1][col] = false;
		}
	}
}
2. 笔记草稿(100%)
import java.util.Scanner;

public class 笔记草稿 {
	public static void main( String[] args ) {
		helper();
	}

	private static void helper() {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		String res = "";
		int count = 0, len = s.length();
		for(int i=0;i<len;i++) {
			char c = s.charAt(i);
			if(c == '(') {
				count ++;
			}else if(c == ')') {
				count --;
			}else if(c == '<') {
				if(res.length() > 0 && count == 0 && res.charAt(res.length() - 1) != ')') {
					res = res.substring(0, res.length() - 1);
				}
			}else if(count == 0) {
				res += c;
			}
		}
		System.out.println(res);
	}
}
3. 迷宫游戏(过了50%)
import java.util.Scanner;

public class 迷宫游戏 {
	public static int min = Integer.MAX_VALUE;
	public static boolean find = false;
	public static void main( String[] args ) {
		helper();
	}

	private static void helper() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		char[][] a = new char[n][n];
		boolean[][] visit = new boolean[n][n];
		int srow = 0, scol = 0, erow = 0, ecol = 0;
		for(int i=0;i<n;i++) {
			String tmp = sc.next();
			for(int j=0;j<n;j++) {
				a[i][j] = tmp.charAt(j);
				if(a[i][j] == 'S') {
					srow = i;
					scol = j;
				}else if(a[i][j] == 'E') {
					erow = i;
					ecol = j;
				}
			}
		}
		findPath(srow, scol, 0, a, visit, erow, ecol);
		if(find) {
			System.out.println(min);
		}else {
			System.out.println(-1);
		}
	}

	private static void findPath( int row , int col , int s , char[][] a , boolean[][] visit, int erow , int ecol ) {
		if(row == erow && col == ecol) {
			find = true;
			if(s < min) {
				min = s;
			}
			return;
		}
		int n = a.length - 1;
		if(col < n && !visit[row][col+1] && a[row][col+1] != '#') { // 右未到头
			visit[row][col+1] = true;
			findPath(row, col + 1, s + 1, a, visit, erow, ecol);
			visit[row][col+1] = false;
		}else if(col == n && !visit[row][0] && a[row][0] != '#'){ // 右到头
			visit[row][0] = true;
			findPath(row, 0, s + 1, a, visit, erow, ecol);
			visit[row][0] = false;
		}
		if(row < n && !visit[row+1][col] && a[row+1][col] != '#') { // 下未到头
			visit[row+1][col] = true;
			findPath(row + 1, col, s + 1, a, visit, erow, ecol);
			visit[row+1][col] = false;
		}else if(row == n && !visit[0][col] && a[0][col] != '#'){ // 下到头
			visit[0][col] = true;
			findPath(0, col, s + 1, a, visit, erow, ecol);
			visit[0][col] = false;
		}
		if(col > 0 && !visit[row][col-1] && a[row][col-1] != '#') { // 左未到头
			visit[row][col-1] = true;
			findPath(row, col - 1, s + 1, a, visit, erow, ecol);
			visit[row][col-1] = false;
		}else if(col == 0 && !visit[row][n] && a[row][n] != '#'){ // 左到头
			visit[row][n] = true;
			findPath(row, n, s + 1, a, visit, erow, ecol);
			visit[row][n] = false;
		}
		if(row > 0 && !visit[row-1][col] && a[row-1][col] != '#') { // 上未到头
			visit[row-1][col] = true;
			findPath(row - 1, col, s + 1, a, visit, erow, ecol);
			visit[row-1][col] = false;
		}else if(row == 0 && !visit[n][col] && a[n][col] != '#'){ // 上到头
			visit[n][col] = true;
			findPath(n, col, s + 1, a, visit, erow, ecol);
			visit[n][col] = false;
		}
	}
}
说实在,感觉题目不太难,自己还是太嫩了😆


#小红书##笔试题目##笔经##题解#
全部评论
def bfs(grid, begin, end):     '''     bfs方法能求得最短路径     :param grid:      :param begin:      :param end:      :return:      '''     n= len(grid)     seen = []     dx = [1, 0, -1, 0]  # 四个方位     dy = [0, 1, 0, -1]     level = []     level.append(begin)     seen.append(begin)     step = 0     while level:         queue = []         step += 1         for q in level:             for i in range(4):                 nx, ny = q[0] + dx[i], q[1] + dy[i]                 if 0 <= nx < n and 0 <= ny < n and grid[nx][ny] != '#':                     if [nx, ny ] in end:                         return step                     if [nx, ny] not in queue and [nx, ny] not in seen:                         queue.append([nx, ny])                         seen.append([nx, ny])         level = queue         print(level)     return -1 if __name__ == '__main__':     n = int(input())     grid = [['' for _ in range(n)] for _ in range(n)]     g3 = []     begin = []     end = []     # 复制9块迷宫  从中间那块迷宫的起点'S'出发,直到到达任意9块迷宫中的'E'     for i in range(n):         s = input()         g3.append(s*3)         grid[i] = list(s)         if 'S' in s:             begin.append(i+n)             begin.append(s.index('S')+n)         if 'E' in s:             for x in range(0,2*n+1,n):                 for y in range(0,2*n+1,n):                     end.append([i + x,s.index('E') + y])     maze = []     for i in range(3):         for j in range(len(g3)):             maze.append(g3[j])     print(bfs(maze, begin, end)) 考试完后想到的一种思路: 1、将复制9块迷宫图组装在一起 2、从中间迷宫图的起点到达任意迷宫图的终点即为到达终点,步进方式用bfs
点赞 回复
分享
发布于 2019-09-03 22:22
求问一下,后端4道题,棋盘+笔记AC,迷宫18%,战利品45%...能拿到面试吗
点赞 回复
分享
发布于 2019-09-03 21:37
滴滴
校招火热招聘中
官网直投
//棋盘问题 public class Main { static int REScount = Integer.MAX_VALUE; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int k = sc.nextInt(); int[][] arr = new int[n][m]; for(int i=0;i<k;i++){ int x = sc.nextInt(); int y = sc.nextInt(); arr[x][y] = 1; } HashSet<String> set = new HashSet<>(); int startX = 0; int stattY = 0; int endX = n-1; int endY = m-1; process(0,arr,set,startX,stattY,endX,endY); if(REScount == Integer.MAX_VALUE){ System.out.println(0); }else{ System.out.println(REScount); } } // public static void process(int count,int[][] arr,HashSet<String> set,int startX,int startY,int endX,int endY){ if(startX == endX && startY == endY){//到达终点 REScount = Math.min(count, REScount); return; }else if( startX<0 || startX>=arr.length || startY<0 || startY>=arr[0].length){//越界 return ; }else if(arr[startX][startY] ==1){//障碍物不能走 return; }else { String loc = startX+"+"+startY; if(set.contains(loc)){//已经走过 return ; }else{ set.add(loc);//添加次点 //上下左右走 process(count+1,arr,set,startX-1,startY,endX,endY); process(count+1,arr,set,startX+1,startY,endX,endY); process(count+1,arr,set,startX,startY-1,endX,endY); process(count+1,arr,set,startX,startY+1,endX,endY); set.remove(loc);//移除改点 } } } }
点赞 回复
分享
发布于 2019-09-04 11:57
第三题,可以分别对x,y纬度排序,然后求对应最长递增子序列的长度吧,返回最长的一个。。。
点赞 回复
分享
发布于 2019-09-03 21:14
第三题跟你差不多用的回溯,45%一直报超时,不知道为什么
点赞 回复
分享
发布于 2019-09-03 21:15
15+15+30+15=75
点赞 回复
分享
发布于 2019-09-03 21:15
import java.util.*; /**  * Created by wxn  * 2019/9/3 19:02  * <p>  * 题目描述:  * 假设以一个n*m的矩阵作为棋盘,每个棋位对应一个二维坐标 (x, y)。你有一颗棋子位于左上起点(0, 0),现在需要将其移动到右下底角 (n-1, m-1),棋子可以向相邻的上下左右位置移动,每个坐标最多只能经过一次。棋盘中散布着若干障碍,障碍物不能跨越,只能绕行,问是否存在到达右下底角的路线?若存在路线,输出所需的最少移动次数;若不存在,输出0。 Input 第一行三个正整数n,m和k,代表棋盘大小与障碍物个数  1< n、m < 100,  k < n*m 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。  * <p>  * 输入  * 输入三个正整数n,m和k,代表棋盘大小与障碍物个数  1< n、m < 100,  k < n*m  * <p>  * 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。  * <p>  * 输出  * 输出从起点到终点的最短路径的长度,如果不存在,即输出0  */ public class Main { static int[][] d = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} }; static int startX = 0; static int startY = 0; static int endX = 0; static int endY = 0; static Set<Integer> stepList = new HashSet<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); //棋盘,障碍物为1,否则为0 /**  * 5  * .#...  * ..#S.  * .E###  * .....  * .....  */ char[][] board = new char[n][n]; for (int i = 0; i < n; i++) { String line = in.nextLine(); for (int j = 0; j < n; j++) { board[i][j] = line.charAt(j); if (board[i][j] == 'S') { startX = i; startY = j; } else if (board[i][j] == 'E') { endX = i; endY = j; } } } shortestLength(board, n); if (stepList.size() == 0) { System.out.println(-1); return; } int minStep = Integer.MAX_VALUE; for (Integer integer : stepList) { if (integer < minStep) { minStep = integer; } } System.out.println(minStep); } private static void shortestLength(char[][] board, int n) { boolean[][] visited = new boolean[n][n]; visited[startX][startY] = true; shortestLength(board, n, startX, startY, 0, visited); } private static void shortestLength(char[][] board, int n, int startX, int startY, int step, boolean[][] visited) { if (startX == endX && startY == endY) { stepList.add(step); return; } for (int i = 0; i < 4; i++) { int newX = startX + d[i][0]; int newY = startY + d[i][1]; if (newX < 0) { newX = n - 1; } else if (newX==n) { newX = 0; } if (newY <0) { newY = n-1; }else if (newY==n){ newY = 0; } if (board[newX][newY] !='#' && !visited[newX][newY]) { visited[newX][newY] = true; shortestLength(board, n, newX, newY, step + 1, visited); visited[newX][newY] = false; } } } }
点赞 回复
分享
发布于 2019-09-03 21:16
请问下第二题里面res.charAt(res.length() - 1) != ')'
点赞 回复
分享
发布于 2019-09-03 21:24
原来以为是题目难,现在才知道是自己太菜,谢谢楼主大贴😂
点赞 回复
分享
发布于 2019-09-03 21:41
棋盘问题直接用dp吧,类似于GED,可以去看看leetcode64
点赞 回复
分享
发布于 2019-09-03 21:43
超时是因为动态规划的算法么
点赞 回复
分享
发布于 2019-09-03 22:47
楼主,有个问题想请教一下,如果说3*3的矩阵,从左上角到右下角的最短路径是5呢还是4呢
点赞 回复
分享
发布于 2019-09-03 23:12
  同学,第一题这个看不懂,为啥还要写这个visit[row-1][col] = false;
点赞 回复
分享
发布于 2019-09-04 10:54
自己真菜,回溯法都不知道,果然得多看大神的
点赞 回复
分享
发布于 2019-09-05 23:20

相关推荐

5 53 评论
分享
牛客网
牛客企业服务