欢乐的代码-2

/**
 * 已知一个计算范围内等概率的方法,求另外一个范围的等概率返回。
 */
public class CalculateProbability {

    public static void main(String[] args) {
        //已知0-5上的概率为fn,求30-39上的概率
        // 1 将0-5上的概率包装成0和1等概率返回。如果是p和p-1也是同样的道理,包装成01和10等概率返回,其它继续。
        // 30-39可以看成 0-8的概率最后+1
        for(int i = 0; i < 50; i++){
            System.out.println(getRandomRes());
        }
    }
    private static int getRandomRes(){
        int res = 0;
        do{
            res = (zeroAndOne() << 3) + (zeroAndOne() << 2) + (zeroAndOne() << 1) + zeroAndOne();
        }while (res == 9 || res == 10 || res == 11 || res == 12 || res == 13 || res == 14 || res == 15 || res == 16);
        return res + 1 + 30;
    }

    /**
     * 等概率返回0和1
     * @return
     */
    private static int zeroAndOne(){
        int res = 0;
        do{
            res = fn();
        }while (res == 4);
        return res % 2;
    }

    /**
     * 0-5上的概率,题目给的函数
     * @return
     */
    private static int fn(){
        Random ran = new Random();
        return ran.nextInt(5);
    }
}


/**
 * 问题描述
 * 数轴上从左到右有n各点a[0],a[1],……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
 * 先输入绳子的长度,然后输入数轴上的点,点以逗号分割,数值是有序的。
 *
 * 算法:滑动窗口
 */
public class SlidingWindow {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int len = Integer.parseInt(sc.nextLine());
            String[] points = sc.nextLine().split(",");
            int maxSize = getMaxCoverPointNum(len, points);
            System.out.println(maxSize);
        }
    }
    private static int getMaxCoverPointNum(int len, String[] points){
        int[] sizeArr = new int[points.length];
        int size = 0;
        // 窗口左侧
        int l = 0;
        //窗口右侧
        int r = 0;
        while(r < points.length){
            //窗口左边的数
            int cur = Integer.parseInt(points[l]);
            //窗口右边的数
            int next = Integer.parseInt(points[r]);
            //如果下一点能够cover长度的话,那么r右移一位,数量加1.继续
            if(len >= (next -cur)){
                ++size;
                ++r;
                sizeArr[l] = size;
                continue;
            }else{
                //记录下当前l能cover几个点,l右移动一位,同时r也要充值为l,个数重置为0
                sizeArr[l] = size;
                ++l;
                r = l;
                size = 0;
            }
        }
        Arrays.sort(sizeArr);
        return sizeArr[sizeArr.length-1];
    }
}
上一篇:笔记笔记笔记


下一篇:剑指 Offer 42. 连续子数组的最大和