百度实习2017 编程题 Java

来源:互联网 发布:淘宝pc与手机尺寸 编辑:程序博客网 时间:2024/06/05 08:00

题目链接:
https://www.nowcoder.com/question/next?pid=4998655&qid=95827&tid=8085039

第三题用啥方法做会比较好…求解
动态规划求解
动态转移方程:ans[i][j] = ans[i-1][j-1](i-1-(j-1)) + ans[i-1][j](j+1)
解释说明:ans[i-1][j-1]*(i-j),i-1个数字的时候,只有j-1个小于号,那么添加数字的同时需要添加一个小于号,在i-1中就不能添加在最前面,所以总共有i-1位置可以添加,其中已经添加了j-1个,那么还剩下i-1-(j-1)=i-j个位置可以添加。
ans[i-1][j]*(j+1):如果i-1个数字中已经有j个小于号,那么新增加的数字不能添加小于号,所以插入的位置只能是已有的小于号两边,所以共有j+1种。
例如:(5,2)=(4,1)*(4-1)+(4,2)(2+1)
对于四个数字的排序的时候为:
4 2 3 1 –> 4>2< 3 > 1 插入数字5的时候,还需要插入一个小于号。 4 2 3 1排序中,能够插入的位置有 4后面、2 后面、4后面 1后面,但是 2后面已经被占用,所有剩下的位置为:4-1
2 3 4 1 – > 2 < 3 < 4 > 1 插入数字5的时候,不能添加小于号了。
当前排序中能够插入的位置 只能是在已经有小于号的数字附近,即第一个数的位置、2的后面、3的后面,所以有 2+1 个情况

package it.baidu;import java.util.Scanner;public class Main3 {    static int n = 0;    static int k = 0;    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner sc = new Scanner(System.in);        n = sc.nextInt();        k = sc.nextInt();        int[][] ans = new int[n+1][n+1];        for(int i=2;i<=n;i++){            ans[i][0] = 1;            ans[i][i-1] = 1;        }        for(int i=3;i<=n;i++){            for(int j=1;j<i-1;j++){                ans[i][j] = (ans[i-1][j-1]*(i-j) + ans[i-1][j]*(j+1))%2017;            }        }        System.out.println(ans[n][k]);        sc.close();    }}

百度实习招聘——第二题
求三角形面积…

Java代码

package it.baidu;import java.util.ArrayList;import java.util.HashMap;import java.util.Scanner;public class Main2 {    static double ans = 0.00000;    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        sc.nextLine();        HashMap<String, ArrayList<Integer[]>> map = new HashMap<>();        for (int i = 0; i < n; i++) {            String str = sc.nextLine();            String[] strs = str.split(" ");            ArrayList<Integer[]> list = new ArrayList<>();            Integer[] temp = new Integer[3];            temp[0] = Integer.valueOf(strs[1]);            temp[1] = Integer.valueOf(strs[2]);            temp[2] = Integer.valueOf(strs[3]);            if (map.containsKey(strs[0])) {                list = map.get(strs[0]);            }            list.add(temp);            map.put(strs[0], list);        }        ArrayList<Integer[]> listR = map.get("R");        ArrayList<Integer[]> listG = map.get("G");        ArrayList<Integer[]> listB = map.get("B");        process1(listB);        process1(listG);        process1(listR);        if (listB != null && listG != null && listR != null) {            for (Integer[] b : listB) {                for (Integer[] g : listG) {                    for (Integer[] r : listR) {                        process2(b, g, r);                    }                }            }        }        System.out.println(String.format("%.5f", ans));        sc.close();    }    public static void process2(Integer[] b, Integer[] g, Integer[] r) {        int x1 = b[0];        int y1 = b[1];        int z1 = b[2];        int x2 = g[0];        int y2 = g[1];        int z2 = g[2];        int x3 = r[0];        int y3 = r[1];        int z3 = r[2];        double len1 = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));        double len2 = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3) + (z1 - z3) * (z1 - z3));        double len3 = Math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3) + (z2 - z3) * (z2 - z3));        if(len1==0||len2==0||len3==0)            return;        if(len1+len2>len3&&len1+len3>len2&&len3+len2>len1){            double p = (len1 + len2 + len3) / 2;            double aera = Math.sqrt(p * (p - len1) * (p - len2) * (p - len3));            ans = Math.max(ans, aera);        }    }    public static void process1(ArrayList<Integer[]> list) {        if (list == null || list.size() < 3) {            return;        }        for (int i = 0, size = list.size(); i < size; i++) {            for (int j = i + 1; j < size; j++) {                for (int k = j + 1; k < size; k++) {                    process2(list.get(i),list.get(j),list.get(k));                }            }        }    }}

第一题:找出第三小的数

package it.baidu;import java.util.HashSet;import java.util.Scanner;public class Main1 {    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] nums = new int[n];        HashSet<Integer> set = new HashSet<>();        for(int i=0;i<n;i++){            nums[i] = sc.nextInt();            set.add(nums[i]);        }        if(set.size()<3){            System.out.println(-1);        }else{            System.out.println(thirdMax(nums));        }        sc.close();    }    public static int thirdMax(int[] nums) {        // 用long的主要作用是为了比较对应的Integer.MAX_VALUE 和 Integer.MIN_VALUE两个值        int[] temp = new int[3];        temp[0] = nums[0];        temp[1] = Integer.MAX_VALUE;        temp[2] = Integer.MAX_VALUE;        for (int i = 1; i < nums.length; i++) {            if (nums[i] < temp[0]) {                temp[2] = temp[1];                temp[1] = temp[0];                temp[0] = nums[i];            } else if (temp[0] < nums[i] && nums[i] < temp[1]) {                temp[2] = temp[1];                temp[1] = nums[i];            } else if (temp[1] < nums[i] && nums[i] < temp[2]) {                temp[2] =  nums[i];            }        }        if (temp[2] == Integer.MAX_VALUE)            return -1;        return temp[2];    }}
0 0
原创粉丝点击