第五届字节跳动青训营后端基础班笔试编程题题解

后端基础班的编程第一题很明显是力扣原题:997. 找到小镇的法官

leetcode.cn/problems/fi…

思路

除了力扣官方的题解外,我们还能进一步优化如下(可能更适合小白):

1.如果存在法官,那么所有人都会信任法官,再结合条件1,可以得出信任法官的人数为n-1。

2.如果不存在法官,那么也可能存在某些人被所有人信任,这个人的信任人数也为n-1,但是他也会信任别人。

3.以此来区分other和judge。假设每个人都有信任值,那么定义一个数组长度为n,用来存放n个人的信任值:

1)如果一个人信任了别人,那么将这个人的信任值-1

2)如果一个人被别人信任,那么这个人的信任值+1

当一个人被所有人信任,并且他没有信任其它人时,这个人的信任值就是n- 1,那么此人就是法官。

当一个人被所有人信任,但是他也信任了其他人时,这个人的信任值<n - 1。

代码

public int findJudge(int N, int[][] trust) {
        int []trusted = new int[N];
        for (int [] arr : trust){
            trusted[arr[0]-1]--;
            trusted[arr[1]-1]++;
        }
        for (int i=0;i<N;i++){
            if (trusted[i]==N-1){
                return i+1;
            }
        }
        return -1;
    }

小孩排队(一个圈)

其实就是小孩排队问题

// 从右往左冒泡
// @s 小孩队列
// @move 该移动的小孩,'B'为男孩,'G'为女孩
public static int bubbleCount(char[] s, char move) {
    int count = 0;
    for (int i = 0; i < s.length - 1; i++) {
        for (int j = s.length - 1; j > i; j--) {
            // 若相邻两小孩性别不同,需要调换
            if (s[j] == move && s[j] != s[j - 1]) {
                swap(s[j], s[j - 1]);
                count++;
            }
        }
    }
    return count;
}