网易传媒2017数据挖掘内推编程题

这篇博客主要介绍了网易传媒2017年数据挖掘内推的编程题目,包括藏宝图、数列还原和分田地三个部分。藏宝图和数列还原被认为是相对简单的题目,可以通过基本的解题思路如dfs+树状数组来解决。然而,对于分田地的题目,博主未能给出完整解答,认为可能可以使用暴力求解方法,但具体细节不详。
摘要由CSDN通过智能技术生成

藏宝图

这里写图片描述
解题思路
水题

import java.util.Scanner;

public class Main{
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            String a=cin.next();
            String b=cin.next();
            int n=b.length();
            if(n==0){
                System.out.println("Yes");
                continue;
            }
            int begin=0;
            boolean flag=true;
            String tmp=a.substring(0);
            for(int i=0;i<n;i++){
                if(begin>=a.length()){
                    flag=false;
                    break;
                }
                //System.out.println(begin);
                char c=b.charAt(i);
                tmp=tmp.substring(begin);
                //System.out.println(tmp);
                int idx=tmp.indexOf(c);
                if(idx==-1){
                    flag=false;
                    break;
                }
                begin=idx+1;

            }
            if(flag)System.out.println("Yes");
            else
                System.out.println("No");
        }
    }
}

数列还原

这里写图片描述
解题思路
水题
dfs+树状数组

import java.util.Scanner;

public class Main{
    public static int s[];
    public static int N=105;
    public static int res=0;
    public static void add(int n,int val){
        while(n<N){
            s[n]+=val;
            n+=lowbit(n);
        }
    }
    public static int sum(int n){
        int cnt=0;
        while(n>0){
            cnt+=s[n];
            n-=lowbit(n);
        }
        return cnt;
    }
    public static int lowbit(int x){
        return x&(-x);
    }
    public static void dfs(int idx,int[]flag,int[]a,int n,int k,int cnt){

        //System.out.println("xxx"+cnt);
        if(cnt==0){
            for(int i=0;i<n;i++)
                System.out.print(a[i]+" ");
            System.out.println();
            s=new int[N];
            int sum=0;
            for(int i=0;i<n;i++)
            {
                sum+=sum(a[i]);
                add(a[i],1);

            }
            //System.out.println(sum);
            if(sum==k)res++;
            return ;
        }if(idx==n)return ;
        //System.out.println(idx);
        for(int i=1;i<=n;i++){
            if(flag[i]==0){
                flag[i]=1;
                a[idx]=i;
                int j;
                for(j=idx+1;j<n;j++)
                    if(a[j]==0)break;
                dfs(j,flag,a,n,k,cnt-1);
                a[idx]=0;
                flag[i]=0;
            }
        }
    }
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        int []x={1,2,3,4};
        s=new int[N];
        int sum=0;
        for(int i=0;i<x.length;i++)
        {
            sum+=sum(x[i]);
            add(x[i],1);

        }
        System.out.println(sum);

        while(cin.hasNext()){
            res=0;
            int n=cin.nextInt();
            int k=cin.nextInt();
            int a[]=new int[n];
            int flag[]=new int[n+1];
            int cnt=0;
            for(int i=0;i<n;i++){
                a[i]=cin.nextInt();
                if(a[i]!=0)flag[a[i]]=1;
                else cnt++;
            }
            int i=0;
            for(i=0;i<n;i++){
                if(a[i]==0)break;
            }
            dfs(i,flag,a,n,k,cnt);
            System.out.println(res);
        }
    }
}

分田地

这里写图片描述
解题思路
没做出来,好像直接暴力可以做出来。。。不懂。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值