拼多多2020.9.1笔试题 T2 and T4

T1简单没套路,T3 a不完。。所以只有T2和T4

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**
 * 第二题
 * 给定一个m*n的由0 1组成的矩阵。每个1代表一个士兵
 * 上下左右相连的兵可以组成一个团
 * 现在可以移动一个士兵的位置,可以把他从任何位置移动到任何另一个位置
 * 问,能组成的最大团的士兵数。
 * 样例
4 4
1 0 1 1
1 1 0 1
0 0 0 0
1 1 1 1

8
 *
 * 这题是考bfs的。。。利用bfs将士兵组成团,然后对于每个团进行编号。
 * 在没有士兵位置的地方,计算临近四个位置所在的团的人数之和。就是将士兵移到这个位置所组成的最大团的人数。
 * 如果人数和最大团相同,那么这个士兵就是从这几个团中移到这里的,否则就是从其他团移到这里,这时就要加1构成最大值。
 *
 *
 *记住不能胡乱粘贴。。。因不注意修改条件直接复制粘贴导致结果总是1 。。。debug到笔试结束,痛苦。。。
 */
public class T2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        Node arr[][] = new Node[n][m];
        boolean use[][] = new boolean[n][m];
        int num1 = 0;
        for (int i = 0; i < n; i++) &#123;
            for (int j = 0; j < m; j++) &#123;
                arr[i][j] = new Node(i, j, sc.nextInt());
                if (arr[i][j].data == 1) &#123;
                    num1++;
                &#125;
            &#125;
        &#125;
        int zln = 1;
        for (int i = 0; i < n; i++) &#123;
            for (int j = 0; j < m; j++) &#123;
                if (arr[i][j].data == 1 && use[i][j] == false) &#123;
                    Queue<Node> q = new LinkedList<Node>();
                    q.add(arr[i][j]);
                    use[i][j] = true;
                    while (!q.isEmpty()) &#123;
                        Node te = q.poll();
                        te.zl = zln;
                        if (te.i - 1 >= 0 && !use[te.i - 1][te.j] && arr[te.i - 1][te.j].data == 1) &#123;
                            q.add(arr[te.i - 1][te.j]);
                            use[te.i - 1][te.j] = true;
                        &#125;
                        if (te.i + 1 < n && !use[te.i + 1][te.j] && arr[te.i + 1][te.j].data == 1) &#123;
                            q.add(arr[te.i + 1][te.j]);
                            use[te.i + 1][te.j] = true;
                        &#125;
                        if (te.j - 1 >= 0 && !use[te.i][te.j - 1] && arr[te.i][te.j - 1].data == 1) &#123;
                            q.add(arr[te.i][te.j - 1]);
                            use[te.i][te.j - 1] = true;
                        &#125;
                        if (te.j + 1 < m && !use[te.i][te.j + 1] && arr[te.i][te.j + 1].data == 1) &#123;
                            q.add(arr[te.i][te.j + 1]);
                            use[te.i][te.j + 1] = true;
                        &#125;

                    &#125;
                    zln++;
                &#125;
            &#125;
        &#125;
        int ans[] = new int[zln];
        for (int i = 0; i < n; i++) &#123;
            for (int j = 0; j < m; j++) &#123;
                if (arr[i][j].data != 0)
                    ans[arr[i][j].zl]++;
            &#125;
        &#125;
        int out = 0;

        HashSet<Integer> hs = new HashSet<Integer>();
        for (int i = 0; i < n; i++) &#123;
            for (int j = 0; j < m; j++) &#123;
                int teout = 0;
                if (arr[i][j].data == 0) &#123;
                    if (i - 1 >= 0 && arr[i - 1][j].data == 1) &#123;
                        hs.add(arr[i - 1][j].zl);
                    &#125;
                    if (i + 1 < n && arr[i + 1][j].data == 1) &#123;
                        hs.add(arr[i + 1][j].zl);
                    &#125;
                    if (j - 1 >= 0 && arr[i][j - 1].data == 1) &#123;
                        hs.add(arr[i][j - 1].zl);
                    &#125;
                    if (j + 1 < m && arr[i][j + 1].data == 1) &#123;
                        hs.add(arr[i][j + 1].zl);
                    &#125;
                &#125;
                for (Integer integer : hs) &#123;
                    teout += ans[integer];
                &#125;
                hs.clear();
                if (teout != num1) &#123;
                    teout++;
                &#125;
                out = Math.max(teout, out);
            &#125;
        &#125;
        System.out.println(out);
    &#125;
&#125;

class Node &#123;
    int data;
    int zl;
    int i;
    int j;

    public Node() &#123;
    &#125;

    public Node(int i, int j, int data) &#123;
        this.i = i;
        this.j = j;
        this.data = data;
    &#125;

&#125;
import java.util.HashSet;
import java.util.Scanner;
/**
 * 第四题
 * 给定一个数n(n<1000000000) 和 一个数组a[m]  m (1<=m<=10,1<=a[i]<=20) 
 * 如果n对于一个数 ai有n%ai==0,则认为两个数相关。
 * 问在 1 - n中有多少个相关
 * 样例
 
10 2
2
3

5

 * 这题是考容斥原理的题。当然要提前处理一下数值,不能有倍数关系。
 * 去除倍数关系之后进行计算值就可
 */
public class T4 &#123;
    public static void main(String[] args) &#123;
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        int m = sc.nextInt();
        HashSet<Integer> hs = new HashSet<Integer>();
        long ans = 0;
        for(int i = 0;i < m; i++) &#123;
            hs.add(sc.nextInt());
        &#125;
        int arr[] = new int[hs.size()];
        int temp = 0;
        for (Integer integer : hs) &#123;
            arr[temp++] = integer;
        &#125;
        for(int i = 0;i<arr.length;i++) &#123;
            for(int j = i+1;j<arr.length;j++) &#123;
                if(Math.max(arr[i], arr[j])%Math.min(arr[i], arr[j])==0) &#123;
                    hs.remove(Math.max(arr[i], arr[j]));
                &#125;
            &#125;
        &#125;
        arr = new int[hs.size()];
        temp = 0;
        for (Integer integer : hs) &#123;
            arr[temp++] = integer;
        &#125;
        for(int i = 1;i<1<<arr.length;i++) &#123;
            int num = 0;
            long test = 1;
            for(int t = i,j=0;t!=0;t>>=1,j++) &#123;
                if((t&1)!=0) &#123;
                    num++;
                    test *= arr[j];
                &#125;
            &#125;
            if((num&1)==0) &#123;
                ans-=n/test;
            &#125;else &#123;
                ans+=n/test;
            &#125;
        &#125;
        System.out.println(ans);
    &#125;
    static int gcd(int a, int b) &#123;
        if(b==0) &#123;
            return a;
        &#125;else &#123;
            return gcd(b,a%b);
        &#125;
    &#125;
&#125;

   转载规则


《拼多多2020.9.1笔试题 T2 and T4》 xfx 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
百度2021校招Java研发工程师笔试 2020_9_3 T2&T3编程题 百度2021校招Java研发工程师笔试 2020_9_3 T2&T3编程题
又是拉胯的一天 /** * 第二题 * 给定n头奶牛,有 m 个条件,满足这 m 个条件的奶牛是优质奶牛。 * 然后就是给定 m 个条件,对于每个条件给 k 个区间,在闭区间内是满足条件的奶牛 * 然后就是问有多少个奶牛是优质的,并
2020-09-04
下一篇 
阿里Java实习生笔试题2020-03-27场 阿里Java实习生笔试题2020-03-27场
阿里的笔试题只有两个编程题,让我很意外。。。本以为会有计算机网络,数据库,操作系统等类的基础题。等笔试的时候发现就有两道编程题。 第一题是一个给定一个序列A与一个序列B,每次只能把序列A的一个字符移动到字符尾,问能否通过这种方式把序列A变为
2020-03-28
  目录