其他分享
首页 > 其他分享> > 每日一题20220605

每日一题20220605

作者:互联网

  1. 给定一个数字n,表示一开始有编号1~n的树木,列成一条直线,
    给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围,
    给定一个数字m,表示你可以补种多少棵树。
    返回补种之后,最长的连续树木,有多少棵。
    滑动窗口的思想
public int longestTrees(int n,int m,int[] arr){
        System.out.printf("一共有{}棵树,其中有这么{}树是缺失的,给你{}这些树是可以进行补救的",n,arr,m);
        int ans =0;
        int start =1;
        System.out.printf("进行循环操作,循环变量i={},j={},j循环{}次",0,m,arr.length);
        for (int i=0,j=m;j<arr.length;i++,j++){
            ans = Math.max(ans,arr[j] - start);
            start = arr[i]+1;
        }
        System.out.printf("最后一次也要进行最大值比较");
        ans = Math.max(ans,n-start+1);
        System.out.printf("得到的结果为{},进行返回",ans);
        return ans;
    }
  1. a -> b,代表a在食物链中被b捕食,
    给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。
    来自理想汽车

  1. 一开始在0位置,每一次都可以向左或者向右跳,
    第i次能向左或者向右跳严格的i步。
    请问从0到x位置,至少跳几次可以到达。
    来自字节
 /**
     * 1- 1
     * 2- 3 1
     * 3- 6 4 2 0
     * 4- 10 8 6 4 2 0
     * 5- 15 13 11 9 7 5 3 1
     * ...
     * @param target
     * @return
     */
    public int reachNumber(long target){
        if (target ==0){
            return 0;
        }
        target = Math.abs(target);
        long l = 0;
        long r = target;
        long m = 0;
        long near = 0;
        while (l<=r){
            m = (l+r)/2;
            if (sum(m)>=target){
                near = m;
                r = m-1;
            }else {
                l = m+1;
            }
        }
        if (sum(near) == target){
            return (int) near;
        }
        if (((sum(near) - target) & 1) ==1){
            near++;
        }
        if (((sum(near) - target) & 1) ==1){
            near++;
        }
        return (int)near;
    }
    public static long sum(long n){
        return (n*(n+1))/2;
    }

标签:arr,return,target,int,20220605,每日,long,near,一题
来源: https://www.cnblogs.com/xyf-study/p/16344420.html