美团2021校招 技术综合-前端&移动端方向 试卷

T1和T2很简单就不写了。
2020.9.6

/**
 * 式子求值
 * 对于序列a下标从1开始到n
 * 定义一个式子:bi=ai⊕⊕{j=1,n}(i%j)
 * 求⊕{i=1,n}(bi)的值
 * ⊕是异或运算
 * bi = ai⊕(i%1)⊕(i%2)⊕(i%3)...⊕(i%n)
 * n<=100000,0<=ai<=n(此处感觉有问题。。。因为样例与这个矛盾。问他们说自己理解。。)
 * 
 * b1 = a1⊕(1%1)⊕(1%2)⊕(1%3)...⊕(1%n)
 * b2 = a2⊕(2%1)⊕(2%2)⊕(2%3)...⊕(2%n)
 * ...
 * 因为异或运算满足交换律的,从这里可以看出,就是对于(1~n)%1⊕(1~n)%2....的值和a的异或
 * 于是就可以计算出异或值后,(1~n)%i如果是偶数就为arr[n%i]的值,否则就是arr[n%i]的值异或arr[i-1]的值
 * emmm感觉还是看程序自己领会一下吧。。
 */
import java.util.Scanner;
public class T3 &#123;
    public static void main(String[] args) &#123;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a[] = new int[n+1];
        int ans = 0;
        for(int i = 1;i<=n;i++) &#123;
            a[i] = sc.nextInt();
            ans^=a[i];
        &#125;
        int arr[] = new int[100005];
        for(int i = 1;i<100005;i++) &#123;
            arr[i] = i^arr[i-1];
        &#125;
        for(int i = 1;i<=n;i++) &#123;
            ans^=arr[n%i]^arr[i*((n/i)%2)==0?0:i*((n/i)%2)-1];
        &#125;
        System.out.println(ans);
    &#125;
&#125;

import java.util.Arrays;
import java.util.Scanner;
/**
 * 第四题
 * 公司有n(n<24)个人,对于每个人只能有一个直系上司
 * 对于每个人他的下属和他自己的总数是ai
 * 问能否构成一个关系满足,
 * 每个人最少有两个下属,或者没有下属。
 * 对于除最高职位的人,都有且只有一个直系上司。
 * 问能否根据ai建立关系树。
 * 
 * 就是一个搜索加上回溯问题,把最高的当做根节点,然后找到和为父节点的值,将这几个当为父节点,进行递归处理。
 * 如果对于排序好的,从高到底的安排节点,不进行回溯,能过45%。会丧失对于较大的节点是另外更大节点的儿子节点,能够组成数的情况。
 * 
 */
public class T4 &#123;
    public static void main(String[] args) &#123;
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) &#123;
            int n = sc.nextInt();
            int arr[] = new int[n];
            for (int i = 0; i < n; i++) &#123;
                arr[i] = sc.nextInt();
            &#125;
            Arrays.sort(arr);
            boolean flag = sl(arr[arr.length - 1], 0, 0, arr);
            if (flag) &#123;
                System.out.println("YES");
            &#125; else &#123;
                System.out.println("NO");
            &#125;
        &#125;
    &#125;

    static boolean sl(int f, int z, int used, int arr[]) &#123;
        int sum = 0;
        int cont = 0;
        if(f==1) &#123;
            return true;
        &#125;
        int use = used;
        for (int j = arr.length - 2; j >= 0; j--) &#123;
            for (int i = j; i >= 0; i--) &#123;
                if ((use & (1 << i)) == 0 && sum + arr[i]+1 <= f) &#123;
                    sum += arr[i];
                    use |= (1 << i);
                    z |= (1 << i);
                    cont++;
                    if (sum + 1 == f) &#123;
                        break;
                    &#125;
                &#125;
            &#125;
            if (sum + 1 != f) &#123;
                return false;
            &#125;
            boolean flag = false;
            if (cont > 1) &#123;
                for (int i = 1; i < arr.length; i++) &#123;
                    if ((z & 1 << i) != 0) &#123;
                        if (arr[i] != 1) &#123;
                            flag = sl(arr[i], 0, use, arr);
                            if (!flag) &#123;
                                break;
                            &#125;
                        &#125; else &#123;
                            use |= 1 << i;
                        &#125;

                    &#125;
                &#125;
            &#125;else &#123;
                return false;
            &#125;
//            for(int i = 1;i<arr.length;i++) &#123;
//                if((use&(1<<i))==0) &#123;
//                    return false;
//                &#125;
//            &#125;
        &#125;
        return true;
    &#125;
&#125;
/*
 * 3 1 1 3 2 1 2
 * 
 * YES NO
 */

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
/**
 * 第二部分题
 * 就是对于m次点名每次把队列中的人叫到第一个,把没在队列的添到第一个。
 * 问队列的学生的编号
 * 这个把点名倒过来就行了。。。
 * 最后点的一定在最前面。然后在前面再次出现就不用管了。。。就行了。
 */
public class T1 &#123;
    public static void main(String[] args) &#123;
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int a[] = new int[m];
        while(m-->0) &#123;
            a[m] = sc.nextInt();
        &#125;
        HashSet<Integer> hs = new HashSet<Integer>();
        ArrayList<Integer> al = new ArrayList<Integer>();
        for(int i = 0;i<a.length;i++) &#123;
            if(!hs.contains(a[i])) &#123;
                al.add(a[i]);
                hs.add(a[i]);
            &#125;
        &#125;
        for (Integer integer : al) &#123;
            System.out.println(integer);
        &#125;
    &#125;
&#125;

   转载规则


《美团2021校招 技术综合-前端&移动端方向 试卷》 xfx 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
MySQL之集合之间的查询 MySQL之集合之间的查询
此为Spring Mapping层的策略根据需求有以下查询情况: 判断一个元素是否在集合里面。可用 IN 判断,要求传入参数为集合,然后通过 <foreach collection="List" item="i" index="
2021-01-27
下一篇 
百度2021校招Java研发工程师笔试 2020_9_3 T2&T3编程题 百度2021校招Java研发工程师笔试 2020_9_3 T2&T3编程题
又是拉胯的一天 /** * 第二题 * 给定n头奶牛,有 m 个条件,满足这 m 个条件的奶牛是优质奶牛。 * 然后就是给定 m 个条件,对于每个条件给 k 个区间,在闭区间内是满足条件的奶牛 * 然后就是问有多少个奶牛是优质的,并
2020-09-04
  目录