程序员的算法趣题:Q10 轮盘的最大值(Java版)

题目说明

轮盘游戏被称为“赌场女王”。
庄家在转动的轮盘中投入滚珠,挑战者的神经跟随滚珠,
滚珠落入押注数字的那一刻,一本千金的迷幻梦境在心头挥之不去。
流传较广的轮盘数字排布和设计有“欧式规则”和“美式规则”两种。
下面我们要找出在这些规则下,“连续 n 个数字的和”最大的位置。
举个例子,当 n = 3 时,
按照欧式规则得到的和最大的组合是 36, 11, 30 这个组合,和为 77;
而美式规则下则是 24, 36, 13 这个组合,得到的和为 73

欧式规则
0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23,
10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26

美式规则
0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15, 3, 24, 36, 13, 1,
00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2

当2 <= n <= 36 时,求连续 n 个数之和最大的情况,
并找出满足条件“欧式规则下的和小于美式规则下的和”的 n 的个数。

思路

1.两个数组分别保存两种规则的数字
2.分别计算n在2~36时,两种规则下的最大值
3.比较最大值,统计欧<美的个数

代码

public static void main(String[] args) {
    // 欧式规则
    int[] eu = {0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26};
    // 美式规则
    int[] am = {0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15, 3, 24, 36, 13, 1, 00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2};
    // 统计最终n的个数
    int count = 0; 

    // 分别计算n在2~36时,两种规则下的最大值
    for(int n = 2; n <= 36; n ++){
        int euMax = findMax(eu,n);
        int amMax = findMax(am,n);
        if(euMax < amMax){ 
            count ++;
        }
    }

    System.out.println("count = " + count);
}
/**
 * 求指定数组arr中,连续n个元素(首位相连)的最大值
 * @param arr   给定的数组
 * @param n     n个元素
 * @return      n个元素的最大值
 */
public static int findMax(int[] arr, int n){
    if(arr == null || n <= 0 || n > arr.length) {
        throw new IllegalArgumentException("入参不合法!");
    }

    int max = 0;
    for(int i = 0; i < n; i ++){
        max += arr[i]; // 计算前n个元素的和
    }

    int tmp = max; // 统计连续n个数的最大值
    for(int i = 0; i < arr.length; i ++){
        tmp -= arr[i]; // 最前面减去一个值
        tmp += arr[(i+n) % arr.length]; // 最后面加上一个值,相当于连续n个元素的范围从[i,i+n-1]变成了[i+1,i+n] (此处仅作范围变化的说明,忽略越界情况。越界情况取余即可)
        if(tmp > max){
            max = tmp;
        }
    }
    return max;
}

 结果

count = 9

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值