其他分享
首页 > 其他分享> > 顺丰面题

顺丰面题

作者:互联网

发给朋友手撸的,在下十分佩服他,高中室友很努力没考好去了西南科技,后面保送中科大材料物理,研一郁闷一年不喜欢,跟导师说通了转到偏计算机。半小时多就完事。。。。我这个渣渣还有一年得抓紧了。

package leetcode;

/**
 * @author 江河
 * @date 2019-08-29 21:21
 */

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;



class Solution{

  public static int findCircleNum(int[][] M) {
    UF uf = new UF(M.length);
    for (int i = 0; i < M.length - 1; i++) {
      for (int j = i + 1; j < M.length; j++) {
        if (M[i][j] == 1) {
          uf.union(i, j);
        }
      }
    }
    return uf.count;

  }

  static class UF {
    public int count;
    private int[] id;
    private int[] sz;

    public UF(int N) {
      id = new int[N];
      for (int i = 0; i < N; i++) {
        id[i] = i;
      }
      sz = new int[N];

      this.count = N;
    }

    public int find(int k) {
      while (id[k] != k) {
        id[k] = id[id[k]];
        k = id[k];
      }
      return k;
    }

    public boolean isConnection(int m, int n) {
      int p = find(m);
      int q = find(n);
      if (p == q) {
        return true;
      }
      return false;
    }

    public void union(int m, int n) {
      if (isConnection(m, n)) {
        return;
      }
      int p = find(m);
      int q = find(n);
      if (sz[p] < sz[q]) {
        id[p] = q;
        sz[q] += sz[p];
      } else {
        id[q] = p;
        sz[p] += sz[q];
      }
      count--;

    }
  }


  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (in.hasNext()) {
      String input1Str = in.nextLine();
      String[] input1 = input1Str.split(" ");
      int n = Integer.parseInt(input1[0]);
      int m = Integer.parseInt(input1[1]);
      int k = Integer.parseInt(input1[2]);
      int[][] languages = new int[k][2];   //确定已经掌握了一些语言的人
      for (int i = 0; i < k; i++) {
        String inputStr = in.nextLine();
        String[] input = inputStr.split(" ");
        languages[i][0] = Integer.parseInt(input[0]);
        languages[i][1] = Integer.parseInt(input[1]);
      }
      Arrays.sort(languages, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
          return o1[1] - o2[1];
        }
      });
      if (languages == null || languages.length == 0) {
        System.out.println(n);
      }
      int[][] relations = new int[n][n];  //创建掌握共同语言的人的关系图
      int num = languages[0][0];
      int language = languages[0][1];
      int l = 1;
      while (l < languages.length) {
        if (languages[l][1] == language) {
          relations[languages[l][0] - 1][num - 1] = 1;  //如果两个人掌握了相同的语言,就把关系图中对应的值设为1,表示能够直接交流
          relations[num - 1][languages[l][0] - 1] = 1;  //如果两个人掌握了相同的语言,就把关系图中对应的值设为1,表示能够直接交流
        } else {
          num = languages[l][0];
          language = languages[l][1];
        }
        l++;
      }
      int isoNum = findCircleNum(relations);  // 根据关系图去寻找图中能直接交流的人,并且分堆。

      System.out.println(isoNum-1);  //如果最后分为了n堆,那么就只需要n-1台机器就能够满足所有人之间的交流
    }
  }

}

 

标签:sz,int,面题,id,languages,new,顺丰,public
来源: https://blog.csdn.net/weixin_43958814/article/details/100147719