网易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

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
评论
8
15
分享
牛客网
牛客企业服务