9.20度小满Java岗2道算法题
本人战绩:1 + 0.91,许愿给个面试机会
第一题:水(1)
import java.util.Scanner; public class T1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s1 = in.next(); String s2 = in.next(); int len1 = s1.length(); int len2 = s2.length(); int res = 0; int[] cnt = new int[26]; for (int i = 0; i < len1; i++) cnt[s1.charAt(i) - 'A']++; for (int i = 0, cur; i < len2; i++) { cur = s2.charAt(i) - 'A'; if (cnt[cur] > 0) { cnt[cur]--; res++; } } System.out.println(res); } }第二题:0.91(超时=。=),有大佬知道我这程序哪里可以优化的么,欢迎各位大佬评论区讨论🤣
我的思路:记录从起点'@'到达各个坐标点需要用到最小技能个数。
#笔试题目##度小满#import java.util.Arrays; import java.util.Scanner; public class T2 { static boolean flag; static int ans; static int[][] dir = new int[][] { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; static boolean[][] vis; static int[][] cost; public static void main(String[] args) { Scanner in = new Scanner(System.in); int T = in.nextInt(); int n, m, sx, sy; char[][] map; while (T-- > 0) { n = in.nextInt(); m = in.nextInt(); in.nextLine(); map = new char[n][m]; vis = new boolean[n][m]; cost = new int[n][m]; for (int i = 0; i < n; i++) { map[i] = in.next().toCharArray(); Arrays.fill(cost[i], 0x3f3f3f3f); } // for (int i = 0; i < n; i++) // for (int j = 0; j < m; j++) // System.out.print(map[i][j] + (j == m - 1 ? "\n" : " ")); sx = 0; sy = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] == '@') { sx = i; sy = j; } } } flag = false; vis[sx][sy] = true; dfs(sx, sy, map, n, m); if (flag) { // System.out.println("cdscsdcs"); System.out.println(0); continue; } flag = false; ans = Integer.MAX_VALUE; cost[sx][sy] = 0; dfs(sx, sy, map, n, m, cost[sx][sy]); System.out.println(flag ? ans : -1); } } static void dfs(int x, int y, char[][] map, int n, int m) { if (flag) return; for (int i = 0; i < 4; i++) { int dx = x + dir[i][0], dy = y + dir[i][1]; // 出界了 if (!check(dx, dy, n, m)) { flag = true; } else if (!vis[dx][dy] && map[dx][dy] == '.') { vis[dx][dy] = true; dfs(dx, dy, map, n, m); } } } static void dfs(int x, int y, char[][] map, int n, int m, int cnt) { for (int i = 0; i < 4; i++) { int dx = x + dir[i][0], dy = y + dir[i][1]; // 出界了 if (!check(dx, dy, n, m)) { flag = true; ans = Math.min(ans, cnt); } else if (map[dx][dy] != '#') { if (map[dx][dy] == '*' && cost[x][y] + 1 < cost[dx][dy]) { cost[dx][dy] = cost[x][y] + 1; dfs(dx, dy, map, n, m, cost[dx][dy]); } else if (map[dx][dy] == '.' && cost[x][y] < cost[dx][dy]) { cost[dx][dy] = cost[x][y]; dfs(dx, dy, map, n, m, cost[dx][dy]); } } } } static boolean check(int x, int y, int n, int m) { return x >= 0 && y >= 0 && x < n && y < m; } }