Seeker的奇妙求职历险(网易互联网笔试)

Stella981
• 阅读 683

素数的个数

给出一个包含n个正整数的数组a,把a[i]拆分为若干个和为a[i]的素数,求拆分后最多能有多少个素数。

第一行数据为n,表示数组长度,第二行为n个元素。
输入
3
1 1 1
输出
0 1不可拆分
输入
1 3 5 7
6 1为0个,3为1个,5为(2,3),7为(2,2,3)

分析:
这道题比较简单,当a[i]>1的时候,素数的个数为a[i]/2。但是要注意原题目的数据范围比较大,最后的总个数可能超出Int上限需要用Long来存,具体代码如下:

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int[] a = new int[n];
    for(int i=0;i<n;i++){
        a[i] = scan.nextInt();
    }
    System.out.println(chaifen(a));
}
public static long chaifen(int[] a){
    long count = 0;
    for(int i=0;i<a.length;i++){
        if(a[i] == 1)
            continue;
        else{
            count+=a[i]/2;
        }
    }
    return count;
}

字典序最小的排列

给出一个长度为m的序列T,求一个长度为n且字典序最小的排列S,要求不改变原序列中元素的相对位置。

第一行输入两个正整数n和m
第二行输入m个数,表示序列
5 3
2 1 5
输出
2 1 3 4 5

分析:这道题我采用归并排序的思路,首先枚举出T中多出来的元素,比如题目中的T相比S就多出来了3 4
然后对两个数组2 1 53 4进行归并排序,具体代码如下:

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int m = scan.nextInt();
    int[] s = new int[m];
    for(int i=0;i<m;i++){
        s[i] = scan.nextInt();
    }
    int[] t =a(s,n);
    for(int i=0;i<t.length-1;i++){
        System.out.print(t[i]);
        System.out.print(" ");
    }
    System.out.print(t[n-1]);
    System.out.print("\n");
}
public static int[] a(int[] s,int n){
    int[] t = new int[n];
    int m = s.length;
    int[] tmp = new int[n-m];
    HashSet<Integer> set = new HashSet<>();
    for(int i:s){
        set.add(i);
    }
    int index=1;
    for(int i=0;i<tmp.length;i++){
        while(set.contains(index))
            index++;
        tmp[i] = index++;
    }
    int index1 = 0;
    int index2 = 0;
    for(int i=0;i<t.length;i++){
        if(index1 <m && index2<n-m){
            if(s[index1] <= tmp[index2]){
                t[i] = s[index1++];
            }else{
                t[i] = tmp[index2++];
            }
        }else if(index1<m){
            t[i] = s[index1++];
        }else{
            t[i] = tmp[index2++];
        }
    }
    return t;
}

丢弃最少物品

给出n个物品,每个物品都有自己的价值,每个物品只有一件,这些物品需要分给两个人,要求分配完之后,两个人的物品价值相同。分配完成之后,会丢弃剩下的物品,求最少要丢弃多少物品。

输入
输入第一行为总的测试数据个数,第二行为物品个数n,第三行为n个物品的价值。
1
5
30 60 5 15 30
输出
20 丢弃5和15,把60分配给第一个人,2个30分配给第二个人。

分析:这道题我一开始想用背包做,但是不知道怎么计算背包的容量,所以就想着先用回溯过几个用例再说,结果没想到直接过了。
不知道有没有大神能够提供最优解。

static int res;
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int t = scan.nextInt();
    while(t-->0){
        res = Integer.MAX_VALUE;
        int n = scan.nextInt();
        int[] item = new int[n];
        for(int i =0;i<n;i++)
            item[i] = scan.nextInt();
        a3(item, 0,0,0, 0);
        System.out.println(res);
    }
}
public static void a3(int[] item,int index,int x,int y,int r){
    if(index == item.length){
        if(x == y)
            res = Math.min(r,res);
        return;
    }
    a3(item,index+1,x+item[index],y,r)
    a3(item,index+1,x,y+item[index],r);
    a3(item,index+1,x,y,r+item[index]);
}

差距最小的生成树

给出一个无向图,一共有n个点,m条边,每条边的权值为v。
求一个生成树,使得图保持联通的同时,权值的最大值和最小值之差最小。

输入
第一行为n和m,表示点的个数和边的条数
后面为m行,表示m条边的两个顶点和其权值
3 5
1 2 10
1 3 5
3 1 12
2 3 19
1 2 74
输出
2 选择边1和3,最小差值为12-10

分析:不会。

牛客大佬找到了原题,给大家分享一下:
https://blog.csdn.net/hjd_love_zzt/article/details/14525117

后记

总的来说这次运气比较好,A了3题,最后一题确实不会做,3题应该能进面试了吧,接下来好好准备阿里和雷火的面试吧。


Seeker的奇妙求职历险(网易互联网笔试)

点赞
收藏
评论区
推荐文章
DaLongggggg DaLongggggg
3年前
python刷题-字母图形
问题描述利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例输入57样例输
先知 先知
3年前
C 语言代码大全
1两个数组的合并题目描述已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。输入输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m,n均小于等于1000000。输出输出合并后的mn个整数,数据之间用空格隔开。输出占一行。样例输入4
Wesley13 Wesley13
3年前
PTA 7
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入格式:输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。输出格式:将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一
DaLongggggg DaLongggggg
3年前
python刷题-数列排序
资源限制时间限制:1.0s内存限制:512.0MB问题描述  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<n<200输入格式  第一行为一个整数n。  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式  输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689···
DaLongggggg DaLongggggg
3年前
python-算法训练 区间k大数查询
问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。输出格式总共输出m行,每行一个数
DaLongggggg DaLongggggg
3年前
python刷题-进制转换
十六进制转八进制问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n(1<n<10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入的十六进制数不会有
DaLongggggg DaLongggggg
3年前
python刷题-数列特征
问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。样例输入513245样例输出5211数据规模与约定1<n<10000。
DaLongggggg DaLongggggg
3年前
python刷题-查找整数
问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出1。样例输入61948399样例输
Wesley13 Wesley13
3年前
Codevs 1159最大全0子矩阵
题目描述Description在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。输入描述InputDescription输入文件第一行为整数N,其中1<N<2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。输出描述OutputDescription
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi