网易2018秋招内推笔试

问题一

问题描述 
小易有一个长度为n的整数序列,a_1,…,a_n。然后考虑在一个空序列b上进行n次以下操作: 
1、将a_i放入b序列的末尾 
2、逆置b序列 
小易需要你计算输出操作n次之后的b序列。

输入描述

输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。 
第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。

输出描述 

在一行中输出操作n次之后的b序列,以空格分割,行末无空格。

分析:

输入长度n 输出序列b
1 a0
2 a1    a0
3 a2    a0    a1
4 a3    a1    a0    a2
5 a4    a2    a0    a1    a3
6 a5    a3    a1    a0    a2    a4

根据上面的表格很容易得出结论

当n为奇数的时候,先将a的所有偶数下标项逆序输出,再将所有奇数下标项正序输出,当n为偶数时正好相反。下面贴出java代码:

import java.util.*;
public class Overturn {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int n = sc.nextInt();
			int[] array = new int[n];
			for(int i=0;i<n;i++)
				array[i]=sc.nextInt();
			if(n%2==0){
				for(int i = n-1;i>0;i-=2)
					System.out.print(array[i] + " ");
				for(int i = 0;i<n-2;i+=2)
					System.out.print(array[i] + " ");
				System.out.print(array[n-2]);
			}
			else{
				for(int i = n-1;i>=0;i-=2)
					System.out.print(array[i] + " ");
				for(int i = 1;i<n-2;i+=2)
					System.out.print(array[i] + " ");
				System.out.print(array[n-2]);
			}
		}
	}
}

问题二

问题描述 

小易现在手里有f个水果和d元,一天要消耗x元房租和1个水果,商店售卖一个水果p元,请问小易能坚持几天。

import java.util.Scanner;

public class Living {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int f = sc.nextInt();
			int d = sc.nextInt();
			int x = sc.nextInt();
			int p = sc.nextInt();
			if(d/x<=f)
				System.out.println(d/x);
			else
				System.out.println((d-f*x)/(x+p)+f);
		}
	}
}

问题三

问题描述 
疯狂队列,给一个数组,顺序可任意排列,要求他们得两两的差值和最大,求这个疯狂值,即:差值。

输入描述 
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数 
第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高

输出描述 
如样例所示: 5 10 25 40 25 
当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。 
这是最大的疯狂值了

import java.util.Arrays;
import java.util.Scanner;

public class CrazyValue {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int n =sc.nextInt();
			int[] arr = new int[n];
			for(int i =0;i<n;i++)
				arr[i] = sc.nextInt();
			Arrays.sort(arr);
			int res = 0,res1=0;
			int middle = n/2;
			if(n%2==0){
				for(int i=0;i<middle;i++)
					res += 2*(arr[i+middle]-arr[i]) ;
				res += arr[middle-1] - arr[middle];
				System.out.println(res);
			}
			else{
				for(int i=0;i<middle;i++){
					res += 2*(arr[i+middle+1]-arr[i]);
					res1 += 2*(arr[i+middle+1]-arr[i]);
				}					
				res += arr[middle-1] -arr[middle];
				res1 += arr[middle] - arr[middle+1];//最后一个数字可能排错
				System.out.println(Math.max(res,res1));
			}
		}
	}

}


猜你喜欢

转载自blog.csdn.net/u010183728/article/details/80014011