zoukankan      html  css  js  c++  java
  • 2020网易校招笔试

    小易的英语软件

    题目描述

    小易需要设计一个反应同学在班上位置的软件,即“成绩超过了 p% 的同学”。
    p = (分数不超过 s 的人)/ 班级总人数 * 100%

    输入

    第一行表示班级总人数 n
    第二行有 n 个自然数,表示第 i 个同学的成绩 ai
    第三行表示查询次数 q
    接下来 q 行,每行一个 x,表示查询第 x 个同学的百分数 p
    1 <= n, q <= 10000, 0 < ai <= 150

    输出

    输出应有 q 行,每行对应一次查询的结果
    为了输出方便,只需要输出百分号前的数,并且保留 6 位小数(四舍五入)

    样例输入

    3
    100 98 97
    3
    1
    2
    3

    样例输出

    66.666667
    33.333333
    0.0000000

    思路

    通过排序成绩 + 二分查找,快速找到 <= s 的数量
    Num[<=s] == Num[< s+1]

    编码

    import java.util.Scanner;
    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner scn = new Scanner(System.in);
    
            int n = scn.nextInt();
            int[] gradeById = new int[n];  // x = gradeById[i] => 表示同学 i 的成绩为 x
            int[] gradeByAsc = new int[n]; // 成绩排序后的数组
            for(int i = 0; i < n; ++i) {
                gradeByAsc[i] = gradeById[i] = scn.nextInt();
            }
    
            Arrays.sort(gradeByAsc);
    
            int q = scn.nextInt();
            for(int i = 0; i < q; ++i) {
                int x = scn.nextInt();
                double ans;
                int position = Arrays.binarySearch(gradeByAsc, gradeById[x-1]+1);
                // 二分查找(同学 i 成绩 + 1)的成绩的位置,该位置-1即为小于等于该成绩的人数
                if(position > 0) {         // 因为可能不存在该成绩,返回 -(插入该数的位置)
                    ans = 1.0*(position-1)/n;
                } else {
                    ans = 1.0*(-position-2)/n;
                }
                System.out.printf("%.6f
    ", ans*100);
            }
        }
    }
    

    小易的首尾相接

    题目描述

    现在有 n 个数,问你是否能用这 n 个数字构成一个首尾相接
    同时保证任意一个数小于它相邻的2个数的和
    (每个数字都必须使用并且只能用一次

    输入

    第一行输入一个整数 t (1 <= t <= 10),表示有 t 组测试用例
    每个测试用例包含以下输入
    第一行一个整数 n,表示数字的个数
    第二行有 n 个整数 (3 <= n <= 10^5, 1 <= ai <= 10^9)

    输出

    应该包含 t 行,对于每组用例,若能输出“YES”,否则输出“NO”。

    样例输入

    1
    5
    17 6 17 11 17

    样例输出

    NO

    思路

    可以任意自己连接,既然出现了比较,我们就可以先排序一下

    1. 假设已经从大到小排序完毕,a0 >= a1 >= a2 >= ... >= an-1
    2. 首先取出 a0,要想让它相邻和比他大,只有让它相邻尽可能的大
    3. 那么我们将 a1、a2 放它左右(例如 a1 a0 a2 这样连接,反之亦可)
    4. 依次往后添加(如:a1 a0 a2 a3 ...),我们会发现,在 a0 后,都可以得到 任意一个数 < 其相邻数的和(即使是 an-2 an-1 a1)
    5. 我们会发现只有 a0 是不确定的,无法直接通过排序得到 a1+a2 > a0
      得到基本思路,只需要找到最大的3个数,判断 max1 < max2 + max3 即可

    编码

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner scn = new Scanner(System.in);
            int t = scn.nextInt();
            for(int i = 0; i < t; ++i) {
                int n = scn.nextInt();
                int max1 = 0, max2 = 0, max3 = 0;
                for(int j = 0; j < n; ++j) {
                    int x = scn.nextInt();
                    if(x > max1) {
                        max1 = x;
                    } else if(x > max2) {
                        max2 = x;
                    } else if(x > max3) {
                        max3 = x;
                    }
                }
                if(max2 + max3 > max1) {
                    System.out.println("YES");
                } else {
                    System.out.println("NO");
                }
            }
        }
    }
    

    小易的最小字典序

    题目描述

    小易给你一个包含 n 个数字的数组,执行任意次一下操作
    对于任意 2 个下表 i、j,如果 ai+aj 为奇数,就可以交换
    问通过任意次交换,得到字典序最小的的一组数

    输入

    第一行一个整数 n
    第二行包含 n 个整数
    (1 <= n <= 10^5,1 <= ai <= 10^9)

    输出

    输出字典序最小的 n 个整数(数字直接包括一个空格)

    样例输入

    4
    7 3 5 1

    样例输出

    7 3 5 1

    思路

    // TODO

    编码

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Scanner;
    
    public class Main {
    
        private static void swap(int[] x, int a, int b) {
            int t = x[a];
            x[a] = x[b];
            x[b] = t;
        }
        public static void main(String[] args) {
            Scanner scn = new Scanner(System.in);
            int n = scn.nextInt();
            int[] nums = new int[n];
            int[] numsByAsc = new int[n];
            HashMap map = new HashMap();
            for(int i = 0; i < n; ++i) {
                numsByAsc[i] = nums[i] = scn.nextInt();
                map.put(nums[i], i);
            }
            Arrays.sort(numsByAsc);
            for(int i = 0; i < n; ++i) {
                int position = (int) map.get(numsByAsc[i]);
                for(int j = 0; j < position; ++j) {
                    if(nums[j] > nums[position] && (nums[j]+nums[position])%2 == 1) {
                        swap(nums, j, position);
                        map.put(nums[j], position);
                        map.put(nums[position], j);
                        break;
                    }
                }
            }
            System.out.print(nums[0]);
            for(int i = 1; i < n; ++i) {
                System.out.print(" " + nums[i]);
            }
            System.out.println();
        }
    }
    

    小易的查询改动个数

    题目描述

    小易在维护数据的时候遇到一个需求,有一个长度为 n 的序列
    接下来要进行 q 次操作,每次查询输入一个 x
    需要将序列种所有大于等于 x 的数减一,并输出被减一的数的个数

    输入

    第一行输入数字个数 n,操作次数 q
    接下来一行 n 个数表示初始数字
    接下来 q 行,每行一个数表示指定的数字

    输出

    输出每次变动的数字

    思路

    // TODO

    编码

    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
        private static void removeTag(int[] nums, int[] tags, int position) {
            int num = 0;
            for(int i = position; i < nums.length; ++i) {
                if (tags[i] != 0) {
                    num += tags[i];
                    tags[i] = 0;
                }
                nums[i] -= num;
            }
        }
        public static void main(String[] args) {
            Scanner scn = new Scanner(System.in);
    
            int n = scn.nextInt(), q = scn.nextInt();
            int[] nums = new int[n];
            int[] tags = new int[n];
            for(int i = 0; i < n; ++i) {
                nums[i] = scn.nextInt();
            }
            Arrays.sort(nums);
            int minTagNum = nums[n-1] + 1, minTag = n;
            for(int i = 0; i < q; ++i) {
                int query = scn.nextInt();
                int position = Arrays.binarySearch(nums, query);
                if(position >= 0) {
                    if (minTagNum < nums[position]) {
                        removeTag(nums, tags, minTag);
                        minTagNum = nums[n - 1] + 1;
                        Arrays.sort(nums);
                        position = Arrays.binarySearch(nums, query);
                    } else {
                        ++tags[position];
                        minTagNum = nums[position] - tags[position];
                        minTag = position;
                    }
                }
                if(position < 0) {
                    System.out.println(0);
                } else {
                    System.out.println(n - position);
                }
            }
        }
    
    }
    
  • 相关阅读:
    小兔生仔和汽水换瓶的两个算法
    dpi 编程
    作者赠送的《我的第一本c++书》收到啦
    什么是程序员的优良品质
    如何把事情做对?
    学习应有的态度
    魔方数算法
    我的第二本c++教科书
    如何处理人际关系
    电动玩具的开发思路
  • 原文地址:https://www.cnblogs.com/qq188380780/p/11495692.html
Copyright © 2011-2022 走看看