15.2 编程题及解析
更新时间:2019.04.24 题目总量:9
以下参考答案均通过在线OJ的审查,符合内存和运行时间要求。
在线编程中,编程语言不限,但以Java和C/C++为主。参考答案以C/Java为主。
15.2.1 坐大巴车(猿辅导笔试真题)
某天猿辅导 HR 组织大家去漂流,早上,参加团建的同学都到齐了,并且按到达公司的先后顺序排好队了。 由于员工太多,一个大巴车坐不下,需要分多个车,车是足够的,但所有人需要按一定顺序上车,按如下规则安排上车的顺序: 假设大巴车容量为 m,从队首开始,每 m 个人分成一个小组,每个小组坐一辆车。同时只有一个车打开车门供员工上车。 小组之间按从队尾到队首顺序依次上车,同一小组内先到的同学先上,求所有人上车的顺序。
例如: 员工数 8, 车容量 3, 员工到达顺序为 1 2 3 4 5 6 7 8, 3个人一个小组,分三个小组, 小组一: 1, 2, 3, 小组二: 4, 5, 6,小组三: 7,8。 小组上车顺序为: 小组三,小组二,小组一 。 所有员工上车顺序为 7 8 4 5 6 1 2 3 |
|
输入描述: 第一行: 员工数和大巴容量 第二行: 所有员工工号(按到达顺序)
输出描述: 员工编号 |
输入例子1: 5 3 1 3 5 2 4
输出例子1: 2 4 1 3 5 |
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int Enum = sc.nextInt(); int Bnum = sc.nextInt(); int[] arr = new int[Enum]; int n = 0; for(int i = 0;i arr[i] = sc.nextInt(); } for(n = 0;n+Bnum int left = n; int right = n + Bnum-1; while(left < right){ int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } if(n int left = n; int right =Enum - 1; while(left < right){ int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } for(int i = Enum-1;i>-1;i--){ System.out.print(arr[i]); if(i!=0){ System.out.print(" "); } } } } |
15.2.2 拍照队形(猿辅导笔试真题)
猿辅导公司的 N位(N>=4)研发同学组织了一次秋游活动,某同学带了个无人机在高空拍照,活动结束时,先拍了一张所有同学排成公司猴头Logo的照片, 接着有人提议再排成“猿”的首字母Y字形来拍一张合照。 用字符串中的每一个字符(不是换行符或结束符'\0')代表一位老师,输出排好后的队形。要求 Y字除去中心点外,上下半部分等高,按照从左到右,从上到下进行排序。队形中没人的部分用空格占位。 输入数据保证可以排出一个完整的Y字,即长度为 3k+1 (k>=1) 例如: 7个 x ,排成队形为(为了方便说明,这里用‘-’代替空格): x---x -x-x --x --x --x |
|||
输入描述: 输入数据有两行,第一行输入N(N<=1000),表示字符串长度。 第二行输入字符串。
输出描述: 用字符串表示的排好的队形,没人处用空格(' ')占位,行尾不能有多余字符,即每行最后一个字符(除了换行符以外),为字符串中代表该老师的字符。
|
输入例子1: 4 a3f/
输出例子1: a 3 f /
|
输入例子2: 7 abcdefg
输出例子2: a b c d e f g
|
输入例子3: 10 iiiiiiiiii
输出例子3: i i i i i i i i i i |
#include int main(){ int n; char arr[1024]={0};
//接受数据 scanf("%d",&n); getchar(); for(int i = 0;i scanf("%c",arr+i); } int group = (n-1)/3; //对于group可以确定四个指标 //1、上下分别有几行-》group //2、两个叉之间的初始间隔-》2*group-1 //3、下方枝的长度group+1 //4、间隔的变化情况0-》group int line = group; int gap = 2*group-1; int height = group+1; for(int i = 0 ;i < n ;i++){ if(i<2*group){ if(i % 2 == 0){ for(int j = 0;j < i/2;j++){ printf(" "); } printf("%c",arr[i]); continue; } else{ for(int j = 0; j< gap ;j++){ printf(" "); } printf("%c\n",arr[i]); gap-=2; continue; } } for(int j = 0; j< group ;j++){ printf(" "); } printf("%c",arr[i]); if(i printf("\n"); } } return 0; } |
15.2.3 第二大的数(搜狐畅游笔试真题)
输入n个整数,查找数组中第二大的数 |
|
输入描述: 第一行n表示n个数,第二行n个空格隔开的数 输出描述: 输出第二大的数 |
输入例子1: 5 1 2 3 4 5 输出例子1: 4 |
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int max = Integer.MIN_VALUE; int sec = Integer.MIN_VALUE; while(sc.hasNext()){ int k = sc.nextInt(); if(k > max) { sec = max; max = k; } else if(k > sec) { sec = k; } } System.out.println(sec); } } |
15.2.4 括号匹配(百度笔试真题)
合法的括号匹配序列被定义为: 1. 空串""是合法的括号序列 2. 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列 3. 如果"X"是一个合法的序列,那么"[X]"也是一个合法的括号序列 4. 每个合法的括号序列都可以由上面的规则生成 例如"", "[]", "[][][]", "[[][]]", "[[[[]]]]"都是合法的。 牛牛现在给出一个括号序列s,牛牛允许你执行的操作是:在s的开始和结尾处添加一定数量的左括号('[') 或者右括号(']')使其变为一个合法的括号匹配序列。牛牛希望你能求出添加最少的括号之后的合法的括号 匹配序列是什么。 |
|
输入描述: 输入包括一个字符串s,s的长度length(1 ≤ length ≤ 50),s中只包含'['和']'。 输出描述: 输出一个字符串,表示括号完全匹配的序列。 |
输入示例: ][ 输出示例: [][] |
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in);
char[] str= sc.nextLine().toCharArray(); int num = 0; int left = 0; for(int i = 0;i if(str[i]=='[') num++; else if(num == 0) left++; else num--; } for(int i = 0;i System.out.print('['); } System.out.print(str); for(int i = 0;i System.out.print(']'); } } } |
15.2.5 比特币买卖最佳时机(招商银行信用卡中心笔试真题)
给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入比特币前卖出。
|
|
输入描述: 正整数数组,为以空格分隔的n个正整数 输出描述: 最大利润
|
示例1 输入 7 1 5 3 6 4 输出 5 |
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); int[] arr = new int[1024]; int i=-1; while(sc.hasNextInt()){ i=i+1; arr[i] = sc.nextInt(); } int n = i; int ret = 0; for(i = 0;i for(int j = i;j ret=ret>(arr[j]-arr[i])?ret:arr[j]-arr[i]; } } System.out.println(ret); } } |
15.2.6 鸡鸭分类问题(招商银行信用卡中心笔试真题)
农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。 |
|
输入描述: 输入一个长度为N,且只包含C和D的非空字符串。 输出描述: 使得最后仅有一对鸡鸭相邻,最少的交换次数
|
示例1 输入 CCDCC 输出 2 |
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); char[] ch = new String(sc.nextLine()).toCharArray(); char target = ch[0]; boolean swi = false; int pos = -1; int ret = 0; int i; int sum = 0; int count = 0; for (i=1;i if(ch[i]==target && swi ==false) continue; if(ch[i]==target && swi ==true){ ret +=(i-pos); count++; sum+=(count-1); } if(ch[i]!=target && swi == false){ pos = i; swi = true; } } if(count == 0){ System.out.println(0); }else{ System.out.println(ret-sum); } } } |
15.2.7 X游戏(招商银行信用卡中心笔试真题)
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方;6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。 现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?
|
|
输入描述: 输入正整数N
输出描述: 输出1到N中好数个数
|
示例1 输入 10 输出 4 说明 在[1, 10]中有四个好数: 2, 5, 6, 9。 注意 1 和 10 不是好数, 因为他们在旋转之后不变。 |
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int ret = 0; for(int i = 1;i <= n ; i++){ int temp = i; int sum = 0; int rev = 0; int back = -1; int ex = 0; while(temp>0){ int pmin = temp % 10; back = -1; switch(pmin){ case 0:back = 0;break; case 1:back = 1;break; case 2:back = 5;break; case 5:back = 2;break; case 6:back = 9;break; case 8:back = 8;break; case 9:back = 6;break; } temp = temp / 10; if(back == -1) break; int pow = 1; for(int j = 0 ; j < ex ; j++){ pow = pow * 10; } rev = rev + pow * back; ex++; } if(back == -1) continue; if(rev == i) continue; ret++; } System.out.println(ret); } } |
15.2.8 黑白矩阵(美团2019春招在线笔试真题)
题目概述:
定义一个矩阵为黑白矩阵,当且仅当对于矩阵内的任意一个元素,其上下左右的数字完全一致(如果存在)且不和本身重复
现给出一个矩阵A,给定大小为n*m,内部数据都为整型,请问至少修改矩阵中的几个元素才能使得矩阵A为黑白矩阵?
输入描述:
第一行:n m
之后n行,每行有m个整数,用空格分割
输出描述:
一个整数
输入样例:
3
3
1
1
1
1
1
1
1
1
1
输出样例:
4
输入样例
2
:
3
3
1
1
1
1
5
1
1
1
1
输出样例
2
:
4
输入样例
3
:
3
4
1
2
3
1
2
3
1
2
3
1
2
3
输出样例
3
:
6
import java.util.*;
public class TestMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Map map0 = new HashMap<>();
Map map1 = new HashMap<>();
int[][] arr = new int[n][m];
for(int i = 0; i list = new ArrayList<>();
for(Map.Entry entry:map0.entrySet()){
Topnum topnum = new Topnum();
topnum.setKey(entry.getKey());
topnum.setValue(entry.getValue());
list.add(topnum);
}
list.sort(Comparator.comparingInt(Topnum::getValue));
List list1 = new ArrayList<>();
for(Map.Entry entry:map1.entrySet()){
Topnum topnum = new Topnum();
topnum.setKey(entry.getKey());
topnum.setValue(entry.getValue());
list1.add(topnum);
}
list1.sort(Comparator.comparingInt(Topnum::getValue));
if(list.get(list.size()-1).getKey().equals(list1.get(list1.size()-1).getKey())){
int left = 0;
int right = 0;
if(list1.size()>1){
left = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2-list1.get(list1.size()-2).getValue();
}else{
left = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2;
}
if(list.size()>1){
right = (m*n+1)/2-list.get(list.size()-2).getValue()+(m*n)/2-list1.get(list1.size()-1).getValue();
}else{
right = (m*n+1)/2+(m*n)/2-list1.get(list1.size()-1).getValue();
}
System.out.println(left>right?right:left);
}else{
int ret1 = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2-list1.get(list1.size()-1).getValue();
System.out.println(ret1);
}
}
}
class Topnum {
private Integer key;
private Integer value;
public Integer getKey() {
return key;
}
public Integer getValue() {
return value;
}
public void setKey(Integer key) {
this.key = key;
}
public void setValue(Integer value) {
this.value = value;
}
}
15.2.9 放置彩球(360安全春招Java后台开发笔试题)
小明家有一些彩球,一段时间后小明玩耍时将它们无序的散落在家中,
一天,小明想对其进行整理,规则为一个篮子中只放一种颜色彩球,
可有多个篮子放同一颜色的球,每个篮子里的球不少于
2
个。
假设小明整理好后,能使各篮子中彩球数量是相同的,则认为小明整理好了。
用一个数字表示一种颜色彩球,一组数表示小明已经找到了的彩球,
问小明用找到的全部彩球能按规则整理好么?
如果可以,输出需要的最少的篮子个数
如果不可以,则输出
0
输入说明:
第一行是彩球的个数n
第二行是n个整数 用空格分割表示每个球的颜色保证这n个数字不完全一样。
输入样例:
6
1
1
2
2
2
2
输出样例:
3
import java.util.*;
public class TestMain{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Map map = new HashMap<>();
for(int i = 0;i < n;i++){
int temp = sc.nextInt();
int count = 1;
if(map.get(temp)!= null){
count = map.get(temp)+1;
}else{
count = 1;
}
map.put(temp,count);
}
if(map.size()==1){
System.out.println(1);
}else{
List list = new ArrayList<>();
for(Map.Entry entry:map.entrySet()){
list.add(entry.getValue());
}
int num = fun(list);
if(num == 1){
System.out.println(0);
}else{
System.out.println(n/num);
}
}
}
private static int fun(List list) {
int[] arr = new int[list.size()];
for(int i = 0;i i1){
i = c;
}else{
i = i1;
i1 = c;
}
c = i - i1;
}
return i1;
}
}