网易4.16笔试

第一题很简单送分的
第二题先计算最大值和最小值,之后整除余数可以填补与最小值的差距即可,o(n)复杂度,但是只过了93%不知道为什么
public static void wy2(Scanner in){
        long n = in.nextLong();
        long k = in.nextLong();
        long x = in.nextLong();

        if(k < n){
            System.out.println(-1);
            return;
        }
        long min = 0;
        for (int i = 1; i <= n; i++) {
            min += i;
        }
        long max = 0;
        for (int i = 0; i < n  ; i++) {
            max += (k - i);
        }
        if(x > max || x < min){
            System.out.println(-1);
            return;
        }
        if(n == 1){
            System.out.println(x);
            return;
        }
        long flag = 0;
        long temp = (int) n;
        long sum = min;
        if(n == k){
            flag = 0;
            temp = 0;
        }else{
            flag = (x - min)/(k - n);
            temp = (x - min)%(k - n);
        }
        for (int i = 0; i < n - flag - 1; i++) {
            System.out.print(i + 1);
            System.out.print(" ");
        }
        for (int i = 0; i < flag; i++) {
            System.out.print(k - i);
            System.out.print(" ");
        }
        if(x != max){
            System.out.println(n - flag + temp);
        }

    }
先写第四题,后来网崩了我就直接提交了不想做了,出去完了
第四题我只想到了n方的方法,一直超时,有无nlogn的想法呢,网崩心也崩,直接没了哈哈哈
public static void wy3(Scanner in){
        int n = in.nextInt();
        long[][] nums = new long[n + 1][2];
        for (int i = 1; i <= n; i++) {
            int num = in.nextInt();
            int temp = num;
            nums[i][0] = nums[i - 1][0];
            nums[i][1] = nums[i - 1][1];
            while(temp % 2 == 0){
                nums[i][0]++;
                temp = temp/2;
            }
            while(temp%5 == 0){
                nums[i][1]++;
                temp /= 5;
            }
        }
        long res = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = i; j <=n ; j++) {
                res += Math.min(nums[j][0] - nums[i - 1][0], nums[j][1] - nums[i - 1][1]);
            }
        }
        System.out.println(res);
    }



#网易笔试##笔试题目##笔经#
全部评论
用线段树维护2,5的个数 下标维护当前i~now的2,5个数,然后实现一个区间查询 区间求和的线段树
3 回复 分享
发布于 2022-04-16 17:26
第二题是回溯吗
1 回复 分享
发布于 2022-04-17 23:03
请问是网易互娱吗?我看15号的面经是三道题,今天是四道?
点赞 回复 分享
发布于 2022-04-16 18:21
第四题所有区间的个数就是n平方,你至少每个区间要遍历一次吧,所以应该不存在比n平方还小的算法吧
点赞 回复 分享
发布于 2022-04-16 18:33
楼主是算法岗还是通用技术岗呢
点赞 回复 分享
发布于 2022-04-16 19:34
第二题怎么证明首尾都取一段,中间找一个数。就一定可以满足条件呢
点赞 回复 分享
发布于 2022-04-16 20:30
第二题的max计算会超出long的范围,我用BigInteger计算max就100%了
点赞 回复 分享
发布于 2022-04-16 20:35
第四题对输入numb取因子2,5的个数的时候,终止条件可能要加个Temp不为0?!
点赞 回复 分享
发布于 2022-04-16 21:18
这到组合题当时系统就转啊转一直超时,可本地怎么测都是对的,当时也就心态崩了
点赞 回复 分享
发布于 2022-04-18 10:54
我和你全部题思路几乎一摸一样,,,,,,真巧
点赞 回复 分享
发布于 2022-04-18 14:14
我第二个题开的longlong 还是93左右,感觉自己哪里写崩了? #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<iostream> using namespace std; long long int ans[100005]; int main() { long long int  n,k,x; scanf("%lld%lld%lld",&n,&k,&x); if(k<n) { printf("-1\n"); return 0; } long long  maxn=(k+k-n+1)*n/2; if(maxn<x) { printf("-1\n"); return 0; } long long minn=(1+n)*n/2; if(minn>x) { printf("-1\n"); return 0; } for(long long int i=1;i<=n;i++) ans[i]=i; long long int dif=x-minn; // printf("%d\n",dif); while(dif>0) { for(long long int i=n;i>=1;i--) { // k-n+1 if( (k-n+i) - i <= dif) { ans[i]=k-n+i; dif=dif-(k-n); // printf("(%d,%d)",ans[i],dif); } else{ ans[i]=i+dif; dif=0; // printf("(%d,%d)",ans[i],dif); break; } } } for(long long int i=1;i<=n;i++) { if(i!=n) printf("%lld ",ans[i]); else printf("%lld\n",ans[i]); } return 0; }
点赞 回复 分享
发布于 2022-04-18 14:17

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
8 15 评论
分享
牛客网
牛客企业服务