vivo 2020提前批笔试

2020 提前批vivo笔试

  • 编程题01
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例
      • 输入
    • 思路:
  • 编程题02
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例
      • 输入
      • 输出
  • 编程题03
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例
      • 输入
      • 输出

师兄参加vivo笔试根据印象讲的题目,这里进行记录并实现代码

编程题01

题目描述

vivo新工业园在落成并入驻启用前,园艺工作人员为了给大家提供更好的办公子境,让大家享受清新空气,特意在新工业园中按园林设计规划种花植树。现在一块长方形的地上种植花草,因受到阳光、水分、肥料等因素影响,相邻的区域不能种植,不然可能导致花草竞争过于激烈而枯死。
假如用一个数列表示土地 上的种植情况(数列元素仅由0、1组成,1表示该区域已种植,0则表示末种植)。现在请你帮助园艺工作人员,在不影响原有花草的情况下,计算出可新种植的最大花草数量。

输入描述

输入的第一行为一个数字, 表示土地的长度;
输入的第二行为一个由0和1组成并以空格分割的数列,表示该土地上目前的种植情况。

输出描述

输出为一个数字,表示在原本的土地状态下,还可种下的最大花草数量。

示例

输入

8
1 0 0 0 0 0 1 0

思路:

方法① 取1和1之间的0来看,中间可以种几个,有一个公式是(n-1)/2就是计算中间种的多少,判断是1的时候,开始计0的个数,到下一个1为止。中间0的个数,就是n,带到公式里,就是中间可以种多少个,公式计算完取商即可。将所有结果相加就是这一排最多可以种多少。
方法② 先判断第一个位置能否种树,再种上第一棵树,判断第二个位置到倒数第二个位置能否种树,然后判断最后一个位置能否种树

在这里插入代码片 思路一
private static int test1(int[] array) {
        if (array.length == 1) {
            if (array[0] == 0) {
                return 1;
            } else {
                return 0;
            }
        }
        int count = 0, i = 0;
        while (i < array.length) {
            if (array[i]==0){
                if (i == 0 ) {
                    if (array[i + 1] == 0) {
                        array[i] = 1;
                        count++;
                    }
                } else if (i == array.length - 1 ) {
                    if (array[i - 1] == 0) {
                        array[i] = 1;
                        count++;
                    }
                } else if (i > 0 && i < array.length - 1) {
                    if ((array[i - 1] == 0 && array[i + 1] == 0)) {
                        array[i] = 1;
                        count++;
                    }
                }
            }
            i++;
        }
        return count;
    }
在这里插入代码片 思路二
public int count() {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if (n < 0){
            return 0;
        }
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        if (arr.length < 1){
            return 0;
        }
        if (arr.length == 1){
            return arr[0] == 0 ? 1 : 0;
        }
        if (arr.length == 2){
            return (arr[0] == 0 && arr[1] == 0) ? 1 : 0;
        }
        // 三指针
        int a = 0;
        int b = 1;
        int c = 2;
        int cnt = 0;
        // 判断第一个位置能否种树
        if (arr[a] == 0 && arr[b] == 0){
            cnt++;
            arr[a] = 1;
        }
        // 判断第二个位置到倒数第二个位置能否种树
        while(c < arr.length){
            if(arr[a] == 0 && arr[b] == 0 && arr[c] == 0){
                cnt++;
                arr[b] = 1;
            }
            a++;
            b++;
            c++;
        }
        // 判断最后一个位置能否种树
        if(arr[a] == 0 && arr[b] == 0){
            cnt++;
            arr[b] = 1;
        }
        return cnt;
    }

编程题02

题目描述

vivo原有的制造中心受限于空间等资源,在生产某系列产品时,需要拆分出多个子流水线 来运作。随着2019年全新的智能制造中心的落成,现需将该系列产品的多个子流水线合并 为一整条完整的流水线。
假设用一个由工序编码组成的有序链表来表示条子流水线,请编程实现合并的功能。

输入描述

第一行由一个数字n组成,n<1000,表示有n个子流水线;
接下来共有n行,每行由空格分割的-组数字组成,表示子流水线的工序编码;
工序编码的大小决定了相对顺序,编码较小的始终在前;
工序编码全局有效,多个子流水线上的相同编码始终代表同一工字。

输出描述

合并后的用工序编码表示的完整流水线,各工序编码之间由空格分割。

示例

输入

4
2 4 8
3 4 6
5 8 9 11
1 6 7 10 12

输出

1 2 3 4 4 5 6 6 7 8 8 9 10 11 12


    //定义链表
    private static class ListNode {
        int val;
        ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    //多条链表的合并 题目三
    private static ListNode test3() {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        sc.nextLine();  // 很重要,跳到第二行
        String[] strArr = new String[m];
        List<Integer> list = new ArrayList<>();

        // 从第二行开始读取
        for (int i = 0; i < m; i++) {
            strArr[i] = sc.nextLine();
            String[] array = strArr[i].split("-");
            for (int j = 0; j < array.length; j++) {
                //System.out.println(array[j]);
                list.add(Integer.valueOf(array[j]));
            }
        }

        //排序
        Collections.sort(list);

        //建立头结点
        ListNode listNode = new ListNode(0);
        ListNode curr = listNode;

        for (int v : list) {
            curr.next = new ListNode(v);
            curr = curr.next;
        }
        return listNode.next;
    }

编程题03

题目描述

vivo每款智能手机在量产 上市前必须经过严格的测试,其中项就是手机跌落测试 ,用来评估手机从一定高度跌落到地面而保持屏幕完整的能力。 在vivo测试中心,有一个专用 的跌落测试塔,共由N层楼组成,每层间隔定高度。 将测试塔放置在基础台面上,然后 将待测手机从测试塔不同楼层将手机以一定的速度推出跌落至地面。 根据测试精度的需要,测试塔层数以及层间隔高度可以任意调整,但不超过10000 (即N <= 1000 )。
现假设存在一个楼层F(0<=F<=N) ,当楼层高于F时,手机屏会被摔碎,当楼层不高于F时则不会碎。每次测试时测试人员可以将待测手机从任意一层的位置推出 ,直到确切 地找到F的值。
请问给定K台测试手机,最少需要测试多少次才能准确的测出F的值?

输入描述

输入为2个正整数K和N,用空格分隔。

输出描述

输出为1个正整数,表示能确切找到时的最少测试次数。

示例

输入

1 2

输出

2

在这里插入代码片

你可能感兴趣的:(招聘)