题目解析:小R的特制骰子 | 豆包MarsCode AI 刷题

105 阅读3分钟

豆包MarsCode215 小R的特制骰子

问题描述

小R打算制作一个nn面的特殊骰子。这个骰子不同于普通的六面骰子,它的每一面都标有不同的数字 a1,a2,,ana_1, a_2, \ldots, a_n。特殊的是,这个骰子必须满足一个条件:所有相对的两面的数字之和必须相等。

例如,对于一个六面骰子,数字为 1,2,3,4,2,31, 2, 3, 4, 2, 3,一种合法的排列可以是:上面是11,下面是44,前面是22,后面是33,左边是22,右边是33

小R想知道,是否可以找到一种方法来制作这样一个符合要求的骰子。题目保证 nn 是偶数。


测试样例

样例1:

输入:n = 6, a = [1, 2, 3, 4, 2, 3] 输出:True

样例2:

输入:n = 4, a = [2, 3, 2, 3] 输出:True

样例3:

输入:n = 8, a = [5, 1, 2, 3, 5, 1, 2, 3] 输出:False

问题链接:小R的特制骰子 - MarsCode


根据题目的要求,需要判断一个数组是否可以形成符合条件的骰子,其中所有相对的两面数字之和必须相等。题目已经给出保证 n 是偶数,因此我们可以通过以下步骤来判断:

解决思路

  1. 排序:首先,对数组进行排序。这样可以将可能的相对面配对按顺序进行检查。
  2. 检查相对面和:相对的两面应该有相同的数字之和。对于排序后的数组,可以从数组两端开始进行配对,检查每对数字的和是否相等。
  3. 判断合法性:遍历数组,配对时检查相对面是否满足条件,如果有一对不符合条件,则返回 false。如果所有的配对都符合条件,则返回 true

具体步骤

  1. 排序:将数字数组排序,方便我们直接从两端进行配对。
  2. 配对检查:检查排序后的数组中,第 i 个数字与第 n-i-1 个数字的和是否相等。
  3. 返回结果:如果所有配对都符合条件,返回 true;否则返回 false

代码实现

import java.util.Arrays;

public class Main {
    public static boolean solution(int n, int[] a) {
        Arrays.sort(a);

        // 计算第一个和最后一个元素的和作为目标和
        int targetSum = a[0] + a[n - 1];

        // 检查是否所有相对的两面的数字之和都等于目标和
        for (int i = 0; i < n / 2; i++) {
            if (a[i] + a[n - i - 1] != targetSum) {
                return false; // 如果发现某一对不符合,返回false
            }
        }

        return true; // 如果所有对都符合条件,返回true
    }

    public static void main(String[] args) {
        System.out.println(solution(6, new int[]{1, 2, 3, 4, 2, 3}) == true); // True
        System.out.println(solution(4, new int[]{2, 3, 2, 3}) == true); // True
        System.out.println(solution(8, new int[]{5, 1, 2, 3, 5, 1, 2, 3}) == false); // False
    }
}

代码解析

  • 首先,对输入的数组 a 进行排序,这样可以方便地从数组的两端进行配对。
  • 然后计算出 a[0] + a[n-1],即第一个和最后一个元素的和作为目标和(假设所有相对面之和都应该相等)。
  • 通过遍历数组,检查第 i 个元素与第 n-i-1 个元素的和是否等于目标和。如果有任何一对不符合条件,立即返回 false
  • 如果遍历结束后,所有的配对都符合条件,则返回 true

时空复杂度

  • 时间复杂度:复杂度基本来自于排序,即O(n log n)
  • 空间复杂度:O(1),只使用了常数级空间。

总结

  • 这道题整体偏简单,感觉题目难度设置有点问题,也可能数据不够严密,导致我这种方法也能通过。