首页 > 2021-3-20 滴滴笔试
头像
文的盲
编辑于 2021-04-06 10:16
+ 关注

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");
        }

    }
}

全部评论

(2) 回帖
加载中...
话题 回帖

推荐话题

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐