拼多多2018校园招聘编程题题解

一、列表补全

[编程题] 列表补全
时间限制:1秒

空间限制:32768K

在商城的某个位置有一个商品列表,该列表是由L1、L2两个子列表拼接而成。当用户浏览并翻页时,需要从列表L1、L2中获取商品进行展示。展示规则如下:

1. 用户可以进行多次翻页,用offset表示用户在之前页面已经浏览的商品数量,比如offset为4,表示用户已经看了4个商品

2. n表示当前页面需要展示的商品数量

3. 展示商品时首先使用列表L1,如果列表L1长度不够,再从列表L2中选取商品

4. 从列表L2中补全商品时,也可能存在数量不足的情况

请根据上述规则,计算列表L1和L2中哪些商品在当前页面被展示了


输入描述:
每个测试输入包含1个测试用例,包含四个整数,分别表示偏移量offset、元素数量n,列表L1的长度l1,列表L2的长度l2。


输出描述:
在一行内输出四个整数分别表示L1和L2的区间start1,end1,start2,end2,每个数字之间有一个空格。
注意,区间段使用半开半闭区间表示,即包含起点,不包含终点。如果某个列表的区间为空,使用[0, 0)表示,如果某个列表被跳过,使用[len, len)表示,len表示列表的长度。

输入例子1:
2 4 4 4
1 2 4 4
4 1 3 3

输出例子1:
2 4 0 2
1 3 0 0
3 3 1 2

题目不难,看懂意思即可,注意分情况讨论,offset可能落在哪个区域。

package 牛客刷题.拼多多2018校招编程.列表补全;

import java.util.Scanner;

/**
 * Created by Administrator on 2018/6/24 0024.
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int offset = scanner.nextInt();
            int n = scanner.nextInt();
            int l1 = scanner.nextInt();
            int l2 = scanner.nextInt();
            int start1 = -1, end1 = -1, start2 = -1, end2 = -1;
            if (offset < l1) {
                if (offset + n <= l1) {
                    start1 = offset;
                    end1 = offset + n;
                    start2 = 0;
                    end2 = 0;
                } else {
                    start1 = offset;
                    end1 = l1;
                    start2 = 0;
                    end2 = (offset + n <= l1 +l2)? offset+n-l1 : l2;
                }
            } else if (offset >= l1 && offset <= l1 + l2) {
                start1 = l1;
                end1 = l1;
                start2 = offset - l1;
                end2 = (offset + n <= l1 + l2)? offset + n -l1 : l2;
            } else {
                start1 = l1;
                end1 = l1;
                start2 = l2;
                end2 = l2;
            }
            System.out.println(start1 + " " + end1 + " " + start2 + " " + end2);
        }
    }
}

二、题目看不懂

三、数三角形

[编程题] 数三角形
时间限制:1秒

空间限制:32768K

给出平面上的n个点,现在需要你求出,在这n个点里选3个点能构成一个三角形的方案有几种。



输入描述:
第一行包含一个正整数n,表示平面上有n个点(n <= 100)
第2行到第n + 1行,每行有两个整数,表示这个点的x坐标和y坐标。(所有坐标的绝对值小于等于100,且保证所有坐标不同)


输出描述:
输出一个数,表示能构成三角形的方案数。

输入例子1:
4
0 0
0 1
1 0
1 1

输出例子1:
4

例子说明1:
4个点中任意选择3个都能构成三角形

嵌套三个循环暴力解,为避免重复,j在i的后面,k在j的后面。判断三点是否能组成三角形。判断三点是否共线。首先如果前两个点重合了,不可能组成三角形。如果前两个点重合,不论k取多少都不能组成三角形。现在判断x2-x1是零的情况。如果前两个点再一条竖直线上,只要第三个点不在这条直线上,肯定能组成三角形。其他情况下,判断乘积公式是否相同即能确定是否在一条直线上,我们要的是不在一条直线上的。

package 牛客刷题.拼多多2018校招编程.数三角形;

import java.util.Scanner;

/**
 * Created by jason on 2018/6/26.
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] points = new int[n][2];
        for (int i = 0; i < n; i++) {
            points[i][0] = scanner.nextInt();
            points[i][1] = scanner.nextInt();
        }
        int count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                for (int k = j+1; k < n; k++) {
                    if (points[i][0] == points[j][0] && points[i][1] == points[j][1]) {
                        break;
                    }
                    if (points[i][0] == points[j][0] && points[j][0] != points[k][0]) {
                        count++;
                        continue;
                    } else {
                        if ((points[j][0] - points[i][0]) *  (points[k][1] - points[j][1]) == (points[k][0] - points[j][0]) * (points[j][1] - points[i][1])) {
                            continue;
                        }
                        count++;
                    }
                }
            }
        }
        System.out.println(count);
    }
}

四、最大乘积

[编程题] 最大乘积
时间限制:1秒

空间限制:32768K

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 
输入描述:
第一行是数组大小n,第二行是无序整数数组A[n]


输出描述:
满足条件的最大乘积

输入例子1:
4
3 4 1 2

输出例子1:
24

冒泡排序的方法,先连用三次,得到最大的三个数。
冒泡排序方法,连用两次,得到最小的两个数。因为最小的两个数很有可能是两个负数,负负得正,有可能得到的值是很大的。
这里用到了大数类。

package 牛客刷题.拼多多2018校招编程.最大乘积;

import java.math.BigInteger;
import java.util.Scanner;

/**
 * Created by jason on 2018/6/26.
 * 测试用例
 * 10
 11155489 456897451 12475 4568 -5467 -10145 5426 -54267 4785921 145
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if (n < 3) {
            return;
        }
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        //冒泡排序求正数的前三个最大值
        //求负数的前两个最小值
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < n-1; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j+1);
                }
            }
        }
        for (int i = 0; i < 2; i++) {
            for (int j = n-1; j >0; j--) {
                if (arr[j] < arr[j-1]) {
                    swap(arr, j , j-1);
                }
            }
        }

        BigInteger num1 = new BigInteger(String.valueOf(arr[n-1]));
        BigInteger num2 = new BigInteger(String.valueOf(arr[n-2]));
        BigInteger num3 = new BigInteger(String.valueOf(arr[n-3]));
        BigInteger res1 = num1.multiply(num2).multiply(num3);
        BigInteger num4 = new BigInteger(String.valueOf(arr[0]));
        BigInteger num5 = new BigInteger(String.valueOf(arr[1]));
        BigInteger res2 = num4.multiply(num5).multiply(num1);
        res1 = res1.compareTo(res2) < 0 ? res2 : res1;
        System.out.println(res1.toString());
        //long num1 = arr[n-1] * arr[n-2] * arr[n-3];
        //long num2 = arr[0] * arr[1] * arr[n-1];
        //long res = Math.max(num1, num2);
        //System.out.println(res);
    }
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}

五、小熊吃糖

小熊吃糖
时间限制:1秒

空间限制:32768K

有n只小熊,他们有着各不相同的战斗力。每次他们吃糖时,会按照战斗力来排,战斗力高的小熊拥有优先选择权。前面的小熊吃饱了,后面的小熊才能吃。每只小熊有一个饥饿值,每次进食的时候,小熊们会选择最大的能填饱自己当前饥饿值的那颗糖来吃,可能吃完没饱会重复上述过程,但不会选择吃撑。
现在给出n只小熊的战斗力和饥饿值,并且给出m颗糖能填饱的饥饿值。
求所有小熊进食完之后,每只小熊剩余的饥饿值。



输入描述:
第一行两个正整数n和m,分别表示小熊数量和糖的数量。(n <= 10, m <= 100)
第二行m个正整数,每个表示着颗糖能填充的饥饿值。
接下来的n行,每行2个正整数,分别代表每只小熊的战斗力和当前饥饿值。
题目中所有输入的数值小于等于100。


输出描述:
输出n行,每行一个整数,代表每只小熊剩余的饥饿值。

输入例子1:
2 5
5 6 10 20 30
4 34
3 35

输出例子1:
4
0

例子说明1:
第一只小熊吃了第5颗糖
第二只小熊吃了第4颗糖
第二只小熊吃了第3颗糖
第二只小熊吃了第1颗糖

正常思路,贪心法,对小熊和糖果排序即可,好好练习自定义排序的写法。

package 牛客刷题.拼多多2018校招编程.小熊吃糖;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 * Created by jason on 2018/6/26.
 * 2 5
 5 6 10 20 30
 4 34
 3 35
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        Candy[] candys = new Candy[m];
        for (int i = 0; i < m; i++) {
            Candy candy = new Candy(scanner.nextInt(), -1);
            candys[i] = candy;
        }
        Bear[] bears = new Bear[n];
        for (int i = 0; i < n; i++) {
            Bear bear = new Bear(scanner.nextInt(), scanner.nextInt());
            bears[i] = bear;
        }
        Bear[] copyBears = Arrays.copyOf(bears, bears.length);
        Arrays.sort(bears);
        Arrays.sort(candys, new MyComparator());
        int i = 0;
        while (i < n) {
            for (int j = 0; j < candys.length; j++) {
                if (bears[i].b >= candys[j].v && candys[j].p == -1) {
                    bears[i].b = bears[i].b - candys[j].v;
                    candys[j].p = 0;
                }
            }
            ++i;
        }
        for (int k = 0; k < n; k++) {
            System.out.println(copyBears[k].b);
        }
    }
}

class Bear implements Comparable<Bear>{
    int a; //战斗力
    int b; //饥饿度
    public Bear(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int compareTo(Bear o) {
        return o.a - this.a;
    }

}

class Candy {
    int v; //糖果的值
    int p; //糖果的标志位,-1代表没被用,0代表以及被吃掉了
    public Candy (int v, int p) {
        this.v = v;
        this.p = p;
    }
}

class MyComparator implements Comparator<Candy> {
    @Override
    public int compare(Candy o1, Candy o2) {
        return o2.v - o1.v;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值