您的位置:首页 > 编程语言

网易2018校招内推编程题集合

2017-08-17 09:01 465 查看
彩色的砖块

输入描述

输出描述

输入例子1

输出例子1

我的解法

标准解法

等差数列

输入描述

输出描述

输入例子1

输出例子1

我的解法

标准解法

取巧解法

交错01串

输入描述

输出描述

输入例子1

输出例子1

我的解法

操作序列

输入描述

输出描述

输入例子1

输出例子1

我的解法

独立的小易

输入描述

输出描述

输入例子1

输出例子1

我的解法

彩色的砖块

小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)

例如: s = “ABAB”,那么小易有六种排列的结果:

“AABB”,”ABAB”,”ABBA”,”BAAB”,”BABA”,”BBAA”

其中只有”AABB”和”BBAA”满足最多只有一对不同颜色的相邻砖块。

输入描述:

输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s中的每一个字符都为一个大写字母(A到Z)。

输出描述:

输出一个整数,表示小易可以有多少种方式。

输入例子1:

ABAB

输出例子1:

2

我的解法

思路:

求出全排列,判断每个排列是否符合要求!

结果:

您的代码已保存
内存超限:您的程序使用了超过限制的内存
case通过率为30.00%


import java.util.*;

public class Main{
public static Set<String> set = new HashSet<String>();
public static void  main(String [] args){
Scanner scanner = new Scanner(System.in);
String stra = scanner.next();
//排列
if(stra==null||stra.length()==0)
return;
char [] chars = stra.toCharArray();
sort(chars,0,chars.length-1);
System.out.println(set.size());
}
public static void sort(char []  chars,int start,int end){
if(start>=end)
{
String item  = new String(chars);
if(isRight(item)&&!set.contains(item))
set.add(item);
return ;
}
for(int i = start;i<=end;i++){
swap(chars,start,i);
sort(chars,start+1,end);
swap(chars,start,i);
}
}
public static void swap(char [] chars,int i,int j){
char value = chars[i];
chars[i] = chars[j];
chars[j] = value;
}

//判定是否符合要求
public static boolean isRight(String value){
int count = 0;
for(int i = 0;i<value.length()-1;i++){
if(value.charAt(i)!=value.charAt(i+1))
count++;
if(count>1)
return false;
}
return true;
}
}


标准解法

import java.util.*;

public class Main{
public static Set<String> set = new HashSet<String>();
public static void  main(String [] args){
Scanner scanner = new Scanner(System.in);
String stra = scanner.next();
if(stra==null||stra.length()==0)
return;
char [] chars = stra.toCharArray();
Set<Character> value = new HashSet<Character>();
for(char item : chars){
value.add(item);
}
if(value.size()>2)
System.out.println(0);
else
System.out.println(value.size());
}
}


等差数列

如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。

小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两个位置的数值的操作,并且交换操作允许交换多次。但是有些数列通过交换还是不能变成等差数列,小易需要判别一个数列是否能通过交换操作变成等差数列

输入描述:

输入包括两行,第一行包含整数n(2 ≤ n ≤ 50),即数列的长度。

第二行n个元素x[i](0 ≤ x[i] ≤ 1000),即数列中的每个整数。

输出描述:

如果可以变成等差数列输出”Possible”,否则输出”Impossible”。

输入例子1:

3

3 1 2

输出例子1:

Possible

我的解法

思路:

把数组进行排序,求出公差

结果:

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例


import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//声明数组,保存元素
int [] value = new int[number];
int i = 0;
while(i<number){
value[i++] = scanner.nextInt();
}
if(value.length==1)
{
System.out.println("Possible");
return ;
}
sort(value);
int index = value[1]- value[0];
for(int k = 1;k<value.length-1;k++){
if(index!=value[k+1]-value[k])
{
System.out.println("Impossible");
return ;
}
}
System.out.println("Possible");

}

public static void sort(int [] value){
for(int i = value.length-1;i>=1;i--){
for(int j = 0;j<i;j++){
if(value[j]>value[j+1])
swap(value,j,j+1);
}
}
}

//交换两元素位置
public static void swap(int [] value,int i,int j){
int temp = value[i];
value[i] = value[j];
value[j] = temp;
}
}


标准解法

import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//声明数组,保存元素
int [] value = new int[number];
int i = 0;
while(i<number){
value[i++] = scanner.nextInt();
}
if(value.length==1)
{
System.out.println("Possible");
return ;
}
Arrays.sort(value);
int index = value[1]- value[0];
for(int k = 1;k<value.length-1;k++){
if(index!=value[k+1]-value[k])
{
System.out.println("Impossible");
return ;
}
}
System.out.println("Possible");

}
}


取巧解法

利用等差数列的求和公式(默认公差d为整数)

import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//声明数组,保存元素
int [] value = new int[number];
int i = 0;
while(i<number){
value[i++] = scanner.nextInt();
}
if(value.length==1
f05e
)
{
System.out.println("Possible");
return ;
}
//保存和
int sum = 0;
//保存首个元素
int a = Integer.MAX_VALUE;;
for(int item : value){
sum+=item;
if(item<a)
a = item;
}
int d = (sum - number*a)%(number*(number-1)/2);
if(d==0)
System.out.println("Possible");
else
System.out.println("Impossible");
}
}


交错01串

如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: “1”,”10101”,”0101010”都是交错01串。

小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。

输入描述:

输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含’0’和’1’

输出描述:

输出一个整数,表示最长的满足要求的子串长度。

输入例子1:

111101111

输出例子1:

3

我的解法

思路:

依次求出每个子串的最长长度,保存最长长度

结果:

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例


import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
String value = scanner.nextLine();
//处理异常情况
if(value.length()<=1)
System.out.println(value.length());
int max = 1;
int count = 1;
for(int i = 1;i<value.length();i++){
if(value.charAt(i)!=value.charAt(i-1))
count++;
else
count=1;
if(count>max)
max = count;
}
System.out.println(max);
}
}


操作序列

小易有一个长度为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序列,以空格分割,行末无空格。

输入例子1:

4

1 2 3 4

输出例子1:

4 2 1 3

我的解法

思路:

找出题目中的规律,即可(尝试通过反转解决,但是只能通过50%)

1 1

12 21

123 312

1234 4213

12345 53124

结果:

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例


import java.util.*;

public class Main{

public static void main(String [] args){
//获取输入
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//数组用来保存值
int [] value = new int[number];
int index = 0;
while(index<number){
value[index++] = scanner.nextInt();
}
//转变后的数据为
int [] aux = new int[number];
//转换过程
int start = 0;
int end = number-1;
boolean flag = true;
for(int i = number-1;i>=0;i--){
if(flag){
aux[start++] = value[i];
flag = false;
}else{
aux[end--] = value[i];
flag = true;
}
}
//输出结果
for(int i = 0;i<number;i++){
if(i!=number-1)
System.out.print(aux[i]+" ");
else
System.out.print(aux[i]);
}

}

}


独立的小易

小易为了向他的父母表现他已经长大独立了,他决定搬出去自己居住一段时间。一个人生活增加了许多花费: 小易每天必须吃一个水果并且需要每天支付x元的房屋租金。当前小易手中已经有f个水果和d元钱,小易也能去商店购买一些水果,商店每个水果售卖p元。小易为了表现他独立生活的能力,希望能独立生活的时间越长越好,小易希望你来帮他计算一下他最多能独立生活多少天。

输入描述:

输入包括一行,四个整数x, f, d, p(1 ≤ x,f,d,p ≤ 2 * 10^9),以空格分割

输出描述:

输出一个整数, 表示小易最多能独立生活多少天。

输入例子1:

3 5 100 10

输出例子1:

11

我的解法

思路:

计算每天消耗后还剩的资源数量,如果最后省下钱,则可以买水果进行生存,如果只有水果剩下,则不进行讨论。

结果:

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例


import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
//每天消耗的钱数
int x = scanner.nextInt();
//已有的水果数
int f = scanner.nextInt();
//已有的钱数
int d = scanner.nextInt();
//每个水果的价格
int p = scanner.nextInt();
//存活的天数
int index = 0;
while(d>=x&&f>=1){
d = d - x;
f = f-1;
index++;
}
//水果没有了,还剩下钱
while(d>=(x+p)){
index++;
d = d-(x+p);
}
System.out.println(index);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网易 编程