20190403笔试题

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());
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值