网易校园招聘编程题真题集合-2018年

编程题

1、小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

2、为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1.

3、一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。

4、魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。
小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。
如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。

5、小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

6、一个合法的括号匹配序列被定义为:
(1). 空串""是合法的括号序列
(2). 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列
(3). 如果"X"是一个合法的序列,那么"(X)"也是一个合法的括号序列
(4). 每个合法的括号序列都可以由上面的规则生成
例如"", "()", "()()()", "(()())", "(((()))"都是合法的。
从一个字符串S中移除零个或者多个字符得到的序列称为S的子序列。
例如"abcde"的子序列有"abe","","abcde"等。
定义LCS(S,T)为字符串S和字符串T最长公共子序列的长度,即一个最长的序列W既是S的子序列也是T的子序列的长度。
小易给出一个合法的括号匹配序列s,小易希望你能找出具有以下特征的括号序列t:
(1)、t跟s不同,但是长度相同
(2)、t也是一个合法的括号匹配序列
(3)、LCS(s, t)是满足上述两个条件的t中最大的
因为这样的t可能存在多个,小易需要你计算出满足条件的t有多少个。
如样例所示: s = "(())()",跟字符串s长度相同的合法括号匹配序列有:
"()(())", "((()))", "()()()", "(()())",其中LCS( "(())()", "()(())" )为4,其他三个都为5,所以输出3.

7、小Q和牛博士合唱一首歌曲,这首歌曲由n个音调组成,每个音调由一个正整数表示。
对于每个音调要么由小Q演唱要么由牛博士演唱,对于一系列音调演唱的难度等于所有相邻音调变化幅度之和, 例如一个音调序列是8, 8, 13, 12, 那么它的难度等于|8 - 8| + |13 - 8| + |12 - 13| = 6(其中||表示绝对值)。
现在要对把这n个音调分配给小Q或牛博士,让他们演唱的难度之和最小,请你算算最小的难度和是多少。
如样例所示: 小Q选择演唱{5, 6}难度为1, 牛博士选择演唱{1, 2, 1}难度为2,难度之和为3,这一个是最小难度和的方案了。

8、小易正在玩一款新出的射击游戏,这个射击游戏在一个二维平面进行,小易在坐标原点(0,0),平面上有n只怪物,每个怪物有所在的坐标(x[i], y[i])。小易进行一次射击会把x轴和y轴上(包含坐标原点)的怪物一次性消灭。
小易是这个游戏的VIP玩家,他拥有两项特权操作:
1、让平面内的所有怪物同时向任意同一方向移动任意同一距离
2、让平面内的所有怪物同时对于小易(0,0)旋转任意同一角度
小易要进行一次射击。小易在进行射击前,可以使用这两项特权操作任意次。

小易想知道在他射击的时候最多可以同时消灭多少只怪物,请你帮帮小易。

如样例所示:

所有点对于坐标原点(0,0)顺时针或者逆时针旋转45°,可以让所有点都在坐标轴上,所以5个怪物都可以消灭。


参考答案

1、

import java.util.Scanner;
 
public class Main{
     
public static void main(String[] args){
    String s = "";
    Scanner in = new Scanner(System.in);
    int num = Integer.parseInt(in.next());
    while(num!=0){
        if(num%2 == 0){
            num =num/2 - 1;
            s=s+"2";
        }
        else{
            num = num/2;
            s=s+"1";
        }
    }
    for(int i=s.length()-1; i>=0; i--) {
        System.out.print(s.charAt(i));
    }
}
}

2、

import java.util.*;
 
public class Main{
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int n = num;
        int newNum = 0;
        while(n>0) {
            newNum = newNum*10 + n%10;
            n /= 10;
        }
        int sum = num+newNum;
        System.out.println(sum);
    }
}

3、

import java.util.Scanner;
import java.text.DecimalFormat; 
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String a = in.nextLine();
        int b = a.length();
        int c = 0;
        int d = 0;
         String f = "";
        while(b!=(d+1)){
            f = a.substring(d,d+1);
            if(!f.equals(a.substring(d+1,d+2))){
                c++;
            }
            d++;
        }
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println(df.format((float)b/(c+1)));
    }
}

4、

import java.util.Scanner;
 
/**
 * 网易2018校园招聘编程题-游历魔法王国
 * 魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。
 * 小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。
 * 如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,
 * 请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。
 * 输入描述:
 * 输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。
 * 第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),
 * 在(i+1)号城市和parent[i]间有一条道路连接。
 * 输出描述:
 * 输出一个整数,表示小易最多能游历的城市数量。
 * 输入例子1:
 * 5 2
 * 0 1 2 3
 * 输出例子1:
 * 3
 *
 * @author shijiacheng
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int L = sc.nextInt();
        int[] array = new int[n];
        for (int i = 1; i < n; i++) {
            array[i] = sc.nextInt();
        }
        int maxLen = 0;
        int[] depth = new int[100];
        for (int i = 1; i < n; i++) {
            depth[i] = depth[array[i]] + 1;
            if (depth[i] > maxLen) {
                maxLen = depth[i];
            }
        }
        int count = 0;
        if (maxLen > L) {
            count = L;
        } else {
            count = (L - maxLen) / 2 + maxLen;
        }
        System.out.println(count + 1);
 
    }
}

5、

import java.util.Scanner;  
   
/** 
 * Created by sunwl1993 on 2017/9/22. 
 */  
public class Main {  
    public static void main(String[] args) {  
        int t;//有多少个数列  
        int n;//每个数列的长度  
        int num4 ;//数列中能被4整除的元素个数  
        int num2 ;//数列种能被2整除的元素个数  
        int num ;//其余元素的个数  
        Scanner sc = new Scanner(System.in);  
        t = sc.nextInt();  
        for(int i = 0; i < t; i ++){  
            n = sc.nextInt();  
            num4 = 0;  
            num2 = 0;  
            num = 0;  
            for(int j=0;j<n;j++){  
                int temp = sc.nextInt();  
                if(temp%4==0)  
                    num4++;  
                else if(temp%2==0)  
                    num2++;  
                else  
                    num++;  
            }  
            if(num<=num4+1)  
                System.out.println("Yes");  
             
            else  
                System.out.println("No");  
        }  
   
    }  
}  

6、

import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner in=new Scanner(System.in);
        String s=in.nextLine();
        System.out.println(work(s));
    }
    public static int work(String s){
        Set<String> set=new HashSet<String>();
        int len=s.length();
        for(int i=0;i<len;i++){
            StringBuilder st=new StringBuilder();
            st.append(s.substring(0,i));
            st.append(s.substring(i+1));
            for(int j=0;j<len-1;j++){
                StringBuilder sw=new StringBuilder();
                sw.append(st.substring(0, j));
                sw.append(s.charAt(i));
                sw.append(st.substring(j));
                if(legal(sw.toString()))
                    set.add(sw.toString());
            }
        }
        return set.size()-1;
    }
    public static boolean legal(String s){
        int count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s.charAt(i)=='(')
                count++;
            else
                count--;
            if(count<0)
                return false;
        }
        return count==0;
    }
}

7、

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        /*
         * 这是一个动态规划题
         */
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int len = in.nextInt();
            int[] arr = new int[len];
            for (int i = 0; i < len; ++i) {
                arr[i] = in.nextInt();
            }
            if (len < 3) {
                System.out.println("0");
            } else {
                int[][] dp = new int[len][len];
                int[] acc = new int[len];
                dp[0][0] = 0 - Math.abs(arr[1] - arr[0]);
                for (int i = 1; i < len; ++i) {
                    acc[i] = acc[i - 1] + Math.abs(arr[i] - arr[i - 1]);
                    dp[i][i - 1] = acc[i - 1];
                    for (int j = 0; j < i - 1; ++j) {
                        dp[i][j] = dp[i - 1][j] + acc[i] - acc[i - 1];
                        dp[i][i - 1] = Math.min(dp[i][i - 1], dp[i - 1][j] + Math.abs(arr[i] - arr[j]));
                    }
                }
                int min = Integer.MAX_VALUE;
                for (int j = 0; j < len - 1; ++j) {
                    min = Math.min(min, dp[len - 1][j]);
                }
                System.out.println(min);
            }
        }
    }
       
}

8、

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] x = new int[n];
        int[] y = new int[n];
        int maxCount = 0;
        int count = 0;
        for(int i = 0 ; i < n ; i ++)
            x[i] = in.nextInt();
        for(int i = 0 ; i < n ; i ++)
            y[i] = in.nextInt();
        in.close();
        if(n <= 3)
            maxCount = n;
        else{
            for(int i = 0 ; i < n ; i ++){
                for(int j = i + 1 ; j < n ; j ++){
                    int X1 = x[i] - x[j];
                    int Y1 = y[i] - y[j];
                    for(int k = 0 ; k < n ; k ++){
                        if(k == i || k == j)
                            continue;
                        count = 3;
                        for(int l = 0 ; l < n ; l ++){
                            if(l == k || l == i || l == j)
                                continue;
                            int X2 = x[l] - x[k];
                            int Y2 = y[l] - y[k];
                            int X3 = x[l] - x[i];
                            int Y3 = y[l] - y[i];
                            if(X1 * X2 + Y1 * Y2 == 0 || X1 * Y3 == X3 * Y1)
                                count ++;
                            if(count > maxCount)
                                maxCount = count;
                        }
                    }
                }
            }
        }
        System.out.println(maxCount);
    }
}
个人资料
Bingo
等级:9
文章:694篇
访问:38.9w
排名: 1
上一篇: 爱奇艺秋季校招Android工程师(第三场)-2018年
下一篇:高性能平台设计—美团旅行结算平台实践
猜你感兴趣的圈子:
网易笔试面试圈
标签: 小易、scanner、城市、游历、魔法、面试题
隐藏