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#