2021-3-20 滴滴笔试
两道题都不是很难,但是怎么不知为何,第一道题(交换一组字符,使其字典序最小的那道)始终卡在27%,不知道有什么注意的点还是特殊的数据吗?
第一题
思路
- 使用
TreeMap
,主键为字母,数据为该字母位置的索引(一个List
),将字符串中所有字符加入 - 从头遍历字符串:
- 如果字符串的对应字符小于
TreeMap
最顶部的字符,就将二者进行交换 - 如果字符串大于,删除
List
中的第一个元素
- 如果字符串的对应字符小于
代码
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String s = sc.nextLine(); TreeMap<Character, List<Integer>> map = new TreeMap<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (map.containsKey(c)) { map.get(c).add(i); } else { List<Integer> list = new LinkedList<>(); list.add(i); map.put(c, list); } } boolean flag = true; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (map.firstKey() < c ) { flag = false; System.out.println(swap(s, i, map.get(map.firstKey()).get(0))); break; } else { map.get(c).remove(0); if (map.get(c).size() == 0) { map.remove(c); } } } if (flag) { System.out.println(s); } } } private static String swap(String s, int start, int min) { StringBuilder sb = new StringBuilder(); sb.append(s, 0, start); sb.append(s.charAt(min)); sb.append(s, start+1, min); sb.append(s.charAt(start)); sb.append(s.substring(min+1)); return sb.toString(); } }
经过查看大家的讨论(另一个帖子),我大概确定问题所在了,应该将索引倒序,交换的时候,应该选择最后一个最小的元素,而不是第一个,脑子一直没转过来,我傻了!
第二题(X救助站的题)
思路
- 这个第一直觉就是每个节点(村庄)都应该有两条路与外界相连,这样的话,就算去掉一条也不至于成为图中的一个鼓励节点,故,查看每个节点是否都有两条路!
代码
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); // k组 int k = sc.nextInt(); for (int i = 0; i < k; i++) { // 数据读取 int n = sc.nextInt(), m = sc.nextInt(); boolean[][] map = new boolean[n+1][n+1]; for (int j = 0; j < m; j++) { int c = sc.nextInt(), r = sc.nextInt(); map[c][r] = map[r][c] = true; } // 每行每列应不少于2个true boolean flag = false; for (int j = 1; j <= n; j++) { int countRow = 0, countCol = 0; for (int l = 1; l <= n; l++) { if (map[j][l]) countRow++; if (map[l][j]) countCol++; } if (countCol < 2 || countRow < 2) { System.out.println("No"); flag = true; break; } } if (!flag) System.out.println("Yes"); } } }#滴滴##笔经##Java#