360 3.6日笔试编程题
技术A卷,两道代码题,第一题36,第二题18,有无大佬分享一下。。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @ClassName: Test_360_1
* @Description:
* @author: LiuGe
* @date: 2022/3/6
*/
public class Test_360_1 {
public static void main(String[] args) {
/**
* 第一题
* 现在的调查问卷越来越多了,所以出现了很多人恶意刷问卷的情况,已知某问卷需要填写名字,,
* 则我们认为这个名字是真实有效的,否则就判定为恶意填写问卷。
* 请你判断出由多少有效问卷(只要名字是真实有效的,就认为问卷有效
*
*/
// 如果名字仅由大小写英文字母组成且长度不超过10即为有效
/**
* 输入第一行包含一个正整数n,表示收到的问卷数量。(1<=n<=2000)
* 接下来有n行,每行有一个由大小写英文字母,数字,下划线组成的字符串,分别表示一份问卷的名字,字符串长度不超过100。
* 输出只有一个整数,表示有效问卷数量。
*/
Scanner scanner = new Scanner(System.in);
// 获取问卷数量和问卷名称
int testCount = scanner.nextInt();
// 对问卷数量进行控制
if(testCount < 1 || testCount > 2000){
System.exit(0);
}
List<String> inputStrings = new ArrayList<>();
for(int i = 0;i < testCount;i++){
String next = scanner.next();
inputStrings.add(next);
}
// 用数组来存储是否合法
boolean[] isLegal = new boolean[inputStrings.size()];
int[] numbers = {0,1,2,3,4,5,6,7,8,9};
// 赋予初值
Arrays.fill(isLegal, false);
// 开始校验
for(int i = 0;i < inputStrings.size();i++){
String inputString = inputStrings.get(i);
// 1、首先判断长度
if(inputString.length() > 100){
isLegal[i] = false;
}
if(inputString.length() > 0 && inputString.length() <= 10){
isLegal[i] = true;
}else{
continue;
}
// 2、看看是否包括数字和下划线
for(int j = 0;j < inputString.length();j++){
char sName = inputString.charAt(j);
for(int k = 0;k < 10;k++){
if(sName == numbers[k]){
isLegal[i] = false;
break;
}
}
}
if(inputString.contains("_")){
isLegal[i] = false;
continue;
}
// 3、接下来判断是否包含大小写英文字母
String s = inputString.toUpperCase();
for(int j = 0;j < s.length();j++){
char sName = s.charAt(j);
isLegal[i] = sName >= 65 && sName <= 97;
}
}
// 统计满足要求的个数
int resultCount = 0;
for (boolean b : isLegal) {
if (b) {
resultCount++;
}
}
System.out.println(resultCount);
}
}
import java.util.*;
/**
* @ClassName: Test_360_2
* @Description:
* @author: LiuGe
* @date: 2022/3/6
*/
public class Test_360_2 {
public static void main(String[] args) {
/**
* 第二题
* 有n个黑白棋子,它们的一面是黑色,一面是白色。它们被排成一行,位置可以用标号1~n来表示。一开始,所有的棋子都是黑色向上,
* 有q次操作,每次操作将位置标号在区间[L, R]内的所有棋子翻转(原来黑色变白色,原来白色变黑色)。
* 请在每次操作后,求这n个棋子中,黑色向上的棋子个数。
*/
/**
* 输入:第一行两个整数 n, q,1 <= n <= 1018, q <= 300;后面q行,每行两个整数 L,R,1 <= L <=R <= n。
* 输出:q行,每行一个整数,表示每次操作后黑色向上的棋子个数。
*/
Scanner scanner = new Scanner(System.in);
int chessCount = scanner.nextInt();
int reverseCount = scanner.nextInt();
// 校验输入参数
if (chessCount > 1018 || chessCount < 1) {
System.exit(0);
}
if (reverseCount > 300 || reverseCount < 0) {
System.exit(0);
}
// 用数组来表示黑白棋子,其中0为白,1为黑,默认全为黑
int[] chess = new int[chessCount];
Arrays.fill(chess, 1);
// 读取后几行的操作范围,并存储起来
Map<Integer, Integer> LRMap = new HashMap<>();
for (int i = 0; i < reverseCount; i++) {
int L = scanner.nextInt();
int R = scanner.nextInt();
if (L > R) {
System.exit(0);
}
if (L < 1 || L > chessCount) {
System.exit(0);
}
if (R > chessCount) {
System.exit(0);
}
LRMap.put(L, R);
}
// 翻转棋子
Set<Integer> LRKeys = LRMap.keySet();
int blackCount;
for (Integer L : LRKeys) {
blackCount = 0;
Integer R = LRMap.get(L);
// 翻转[L,R]的棋子
for (int i = L - 1; i < R; i++) {
chess[i] = (chess[i] + 1) % 2;
}
// 翻转结束后输出黑色向上的个数
for (int i = 0; i < chessCount; i++) {
if (chess[i] == 1) {
blackCount++;
}
}
System.out.println(blackCount);
}
}
}

