【华为OD题库-052】数字序列比大小-java

题目

A,B两个人玩一个数字比大小的游戏,在游戏前,两个人会拿到相同长度的两个数字序列,两个数字序列是不完全相同的,且其中的数字是随机的。
A,B各自从数字序列中挑选出一个数字进行大小比较,赢的人得1分,输的人扣1分,相等则各自的分数不变。用过的数字需要丢弃。
求A可能赢B的最大分数
输入描述
输入数据的第1个数字表示数字序列的长度N,后面紧跟着两个长度为N的数字序列,
输出描述
A可能嬴B的最大分数
备注
1.这里要求计算A可能赢B的最大分数,不妨假设,A知道B的数字序列,且总是B先挑选数字并明示
2.可以采用贪心策略,能赢的一定要赢,要输的尽量减少损失。
示例1:
输入
3
4 8 10
3 6 4
输出
3
说明
输入数据第1个数字表示数字序列长度为3,后面紧跟着两个长度为3的数字序列。
序列A:4 8 10
序列B:3 6 4
A可以赢的最大分数是3。获得该分数的比大小过程可以是:
1)A: 4 B:3
2)A: 8 B:6
3)A:10 B:4

思路

将两个数字序列升序排序,设序列A,B,将排序后的B加入队列queue中(队首最小,队尾最大)
遍历A中数据:
看A[i]和queue队首的大小关系,如果A[i]<=queue.peekFirst(),说明不可能赢,分数减一(ans–),那么将损失降到最低,直接和B最大元素比较,此时移除队尾即可
如果A[i]>queue.peekFirst(),那么是能赢的,直接ans++,并移除队首元素。

题解

package hwod;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class NumQueueCompare {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        int[] nums1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] nums2 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        System.out.println(numQueueCompare(nums1, nums2));
    }

    private static int numQueueCompare(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i < nums2.length; i++) {
            queue.add(nums2[i]);
        }
        int ans = 0;
        for (int i = 0; i < nums1.length; i++) {
            if (nums1[i] <= queue.peekFirst()) {
                ans--;
                queue.removeLast();
            } else {
                ans++;
                queue.pollFirst();
            }
        }
        return ans;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

你可能感兴趣的:(华为OD题库JAVA题解,java,华为od)