百度面经 (java后台一面)

  1. 给定一个数组 和一个目标值 找出他的子序列 子序列的定义是这个序列中的最大值和最小值加起来小于等于这个目标值 问这样的子序列有几个
  2. n个元素的序列有几个子集
  3. 有一堆石子 两个人拿石子 每次只能拿完全平方数个石子 问 输入一个数n 这个先拿的人有没有必胜的可能
  4. 有三个线程 需要的资源个数是2 3 4 问 最少给多少个资源 才不会发生死锁
  5. tcp传输过程中传说长度过长 报文是怎么处理的 udp呢 若分片之后有一片丢失了 然后会怎么处理
    问题五: udp传输报文超过最大传输长度MTU 就会在ip层被分片 反之不会 分片之后第一段报文带着udp的头部信息 其余带着ip信息 在传输层重组 如果这其中有一片报文丢失 整段报文失效 udp不可靠传输体现

问题1:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/**
 * 最长子序列
 * 思路分析 :找出所有子序列 判断是否是满足规则的子序列
 * 找出所有子序列 采用位运算的形式
 */
public class MaxChildCollection {

    private static int result = 0;
    private static Set<ArrayList> resultSet = new HashSet<ArrayList>();

    //找出该序列的所有子集
    //1-8的二进制表示 是将每一位上的01 都组合过的 若用这个01表示数字不采用或采用 则能表示出nums数组的所有子数组 包括null
    public static int findChild(int[] nums, int target) {
        int len = nums.length;
        int temp = len == 0 ? 0 : 1 << len;//一共有多少个子集
        for (int i = 0; i < temp; i++) {//举出所有01的组合
            int index = i;
            ArrayList<Integer> list = new ArrayList<Integer>();
            for (int j = 0; j < len; j++) {
                if ((index & 1) == 1) {
                    list.add(nums[j]);
                }
                index >>= 1;
            }
            if (list != null && list.size() > 0) {//所有子序列中含有空值
                if (meet(list, target)) {
                    boolean add = resultSet.add(list);
                    if (add) {
                        result++;
                    }
                }
            }

        }
        return result;

    }
    /**
     * 判断是否为符合要求的子序列
     *
     * @param list
     * @param target
     * @return
     */
    public static boolean meet(ArrayList<Integer> list, int target) {
        if (list.size() == 1) { //若list里只有一个值 不用找他的最大值和最小值
            return list.get(0) <= target ? true : false;
        }
        int[] minAndMax = findMinAndMax(list);


        return minAndMax[0] + minAndMax[1] <= target ? true : false;
    }

    /**
     * 找出数组中的最大值和最小值
     */
    public static int[] findMinAndMax(ArrayList<Integer> list) {
        int[] nums = new int[2];
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int temp : list) {
            if (temp < min) {
                min = temp;
            }
            if (temp > max) {
                max = temp;
            }
        }
        nums[0] = min;
        nums[1] = max;
        return nums;
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        int result = findChild(nums, 3);
        System.out.println(result);
        for (ArrayList list : resultSet) {
            System.out.println(list);
        }
        System.out.println(resultSet.size());
    }
}

问题二:
n个元素的序列含有2的次方个子序列 含有2的n次方-1个非空子序列

你可能感兴趣的:(百度面经 (java后台一面))