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#
全部评论
大概了解了,应该使用最后一个最小的字母进行交换!结帖啦!
点赞 回复 分享
发布于 2021-03-20 20:59
有兄弟帮忙看看这代码为啥不a吗 import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         String str = sc.next();         int n = str.length();         char[] s = str.toCharArray();         int[] minL = new int[n];         minL[n - 1] = n - 1;         for (int i = n - 2; i >= 0; --i) {             minL[i] = s[minL[i + 1]] < s[i] ? minL[i + 1] : i;         }         for (int j = 0; j < n - 1; j++) {             if (s[j] > s[minL[j + 1]]) {                 swap(s, j, minL[j + 1]);                 System.out.println(s);                 return;             }         }         System.out.println(str);     }     private static void swap(char[] s, int a, int b) {         char tmp = s[a];         s[a] = s[b];         s[b] = tmp;     } }
点赞 回复 分享
发布于 2021-03-20 21:26

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务