20190403笔试题
第一题
题目描述:
按照给定组大小,合并给定的n个数字数组。
输入描述:
第1行是每组元素个数;
第2行开始是2 - n个数字数组;
数组之间用回车分隔,数组内元素用逗号分隔。
输出描述:
输出合并后的数字数组,元素间用逗号分隔。
示例1:
输入:
3
2,5,6,7,9,5,7
1,7,4,3,4
输出:
2,5,6,1,7,4,7,9,5,3,4,7
示例2:
输入:
4
2,5,6,7,9,5,7
1,7,4,3,4
输出:
2,5,6,7,1,7,4,3,9,5,7,4
分析:
本题在解题时,遇到的困难是数字数组的个数未知,输入的终止条件不会写。正确的写法是:if(str.matches("\s*")) break;
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int step = Integer.parseInt(scanner.nextLine()); //不能用scanner.nextInt(),会导致后面数组输入不进去;
String res = "";
ArrayList<String> list = new ArrayList<>();
while(scanner.hasNextLine()) {
String input = scanner.nextLine();
if(input.matches("\\s*")) {
break;
}
list.add(input);
}
int maxLength = 0;
for(String str : list) {
if(str.length() > maxLength)
maxLength = str.length();
}
int index = 0;
while(index < maxLength) {
for(String str : list) {
if(index < str.length()) {
if(index + step * 2 < str.length()) {
res += str.substring(index, index + step * 2);
}else {
res += str.substring(index, str.length());
res += ",";
}
}
}
index += step * 2;
}
System.out.println(res.substring(0, res.length()-1));
}
}
第二题
题目描述:
对输入字符串检查是否存在非法字符,输出合法字符串(去重)和非法字符串(不去重)。
对合法字符串循环左移10次,再进行排序输出。(举例:字符串“abc”,循环左移一次的结果为”bca”)。
输入描述:
(1) 字符串中的字符集合为’0’-‘9’,‘a’-‘z’,‘A’-‘Z’,其余为非法字符(空字符串作为定界符),有非法字符的字符串视为非法输入;
(2) 作为输入的字符串个数不超过100,每个字符串长度不超过64;
(3) 作为输入的连续空字符串(空格、制表符、回车、换行符)作为一个空格处理(作为定界符,字符串起始字符不为空);
(4) 输入每行只有一个字符;
(5) 输入以空行结束。
输出描述:
(1) 输出合法字符串并去重;
(2) 输出所有非法字符串;
(3) 对结果1的去重合法字符串循环左移10次;
(4) 对结果3合法字符串排序,按ASCII表字符从小到大顺序排序。
注意事项:
每输出一个字符后用空格跟下一个字符串隔离,作为输出的所有字符串之间只能有一个空格(作为定界符)。
示例1:
输入:
abc
def
==
acd123
44234tjg
aga’-=
ad—s
abd
123
abcdef
123456789012345678901234567890123456789012345678901234567890123
EDFG
SDFG
ABC
DEF
cccc
a*b=1
abc
cccc
dd
def
87&&^
abc
asdfas
234abc35
765rgfh4sd
1231
123
==
EDFG
输出:
abc def acd123 44234tjg abd 123 abcdef 123456789012345678901234567890123456789012345678901234567890123 EDFG SDFG ABC DEF cccc dd asdfas 234abc35 765rgfh4sd 1231
== aga’-= ad—s a*b=1 87&&^ ==
bca efd 23acd1 234tjg44 bda 231 efabcd 123456789012345678901234567890123456789012345678901231234567890 FGED FGSD BCA EFD cccc dd asasdf 4abc3523 765rgfh4sd 3112
123456789012345678901234567890123456789012345678901231234567890 231 234tjg44 23acd1 3112 4abc3523 765rgfh4sd BCA EFD FGED FGSD asasdf bca bda cccc dd efabcd efd
分析:
本题的重点考察了正则表达式的理解和使用。"\s+“表示1个或多个空白字符,”[0-9a-zA-Z]+"表示只有数字和大小写字母构成的字符串。
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<String> inputs = new ArrayList<>();
ArrayList<String> legal = new ArrayList<>();
ArrayList<String> illegal = new ArrayList<>();
ArrayList<String> leftShift = new ArrayList<>();
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
if(line.matches("\\s*")) {
break;
}
inputs.add(line.replaceAll("\\s+", ""));
}
for(String input : inputs) {
if(input.matches("[0-9a-zA-Z]+")) {
if(!legal.contains(input)) {
legal.add(input);
}
}else {
illegal.add(input);
}
}
StringBuilder out = new StringBuilder();
for(String str : legal) {
out.append(str+" ");
}
System.out.println(out.toString());
out = new StringBuilder();
for(String str : illegal) {
out.append(str+" ");
}
System.out.println(out.toString());
out = new StringBuilder();
for(String str : legal) {
String leftStr = left(str);
leftShift.add(leftStr);
out.append(leftStr+" ");
}
System.out.println(out.toString());
out = new StringBuilder();
Collections.sort(leftShift);
for(String str : leftShift) {
out.append(str+" ");
}
System.out.println(out.toString());
}
private static String left(String str) {
StringBuilder sb = new StringBuilder(str);
for(int i = 0; i < 10; i++) {
sb.append(sb.charAt(0));
sb.deleteCharAt(0);
}
return sb.toString();
}
}
第三题
题目描述:
给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号和小括号),括号可以嵌套,即括号里面可以出现数字和括号。
按照如下的规则对字符串进行展开,不需要考虑括号成对不匹配问题,用例保证括号匹配,同时用例保证每个数字后面都有括号,不用考虑数字后面没有括号的情况,即2a2(b)这种情况不用考虑。
(1) 数字表示括号里的字符串重复的次数,召开后的字符串不包括括号。
(2) 将字符串进行逆序展开。
输出最终展开的字符串。
输入描述:
输入一个长度小于100的字符串
输出描述:
输出展开后的字符串
示例1:
输入:
abc3(A)
输出:
AAAcba
代码:
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] str = sc.nextLine().toCharArray();
Stack<String> sk = new Stack<String>();
StringBuilder res = new StringBuilder();
for(int i=0;i<str.length;i++) {
if(str[i]!=']'&&str[i]!='}'&&str[i]!=')'){
sk.push(String.valueOf(str[i]));
}else {
if(str[i]==']') {
StringBuilder sb = new StringBuilder();
while(!sk.empty()&&!sk.peek().equals("[")) {
sb.append(sk.pop());
}
if(!sk.empty())
sk.pop();
int cnt = Integer.valueOf(sk.pop());
StringBuilder sb1 = new StringBuilder();
while(cnt>0) {
sb1.append(sb.toString());
cnt--;
}
sk.push(String.valueOf(sb1));
}else if(str[i]=='}') {
StringBuilder sb = new StringBuilder();
while(!sk.empty()&&!sk.peek().equals("{")) {
sb.append(sk.pop());
}
if(!sk.empty())sk.pop();
int cnt = Integer.valueOf(sk.pop());
StringBuilder sb1 = new StringBuilder();
while(cnt>0) {
sb1.append(sb.toString());
cnt--;
}
sk.push(String.valueOf(sb1));
}else if(str[i]==')') {
StringBuilder sb = new StringBuilder();
while(!sk.empty()&&!sk.peek().equals("(")) {
sb.append(sk.pop());
}
StringBuilder sb1 = new StringBuilder();
if(!sk.empty())sk.pop();
int cnt = Integer.parseInt(sk.pop());
while(cnt>0) {
sb1.append(sb.toString());
cnt--;
}
sk.push(String.valueOf(sb1));
}
}
}
while(!sk.empty()) {
res.append(sk.pop());
}
System.out.println(res.toString());
}
}