360笔试-10.24
题目1
import java.util.*; import java.util.stream.Collectors; /** * @author wanna * @version v1.0 * @Package com.wanna.main50 * @date 2021/10/19 11:06 下午 */ public class Main { /* @360-1 时间限制: 3000MS 内存限制: 786432KB 题目描述: 小A的英语考了个不及格,老师很生气,并且发现他英语的语法几乎全错!于是老师决定好好教教他英语语法。 老师想先从句子结构开始教他。一个句子至少需要包含主谓结构,即主语和谓语,并且主语在前,谓语在后。 有些句子会在谓语后面加上宾语。避免复杂,本题中句子的顺序严格按照主语-谓语-宾语的顺序(即无宾语前置和倒装等情况)。 老师给了小A三张单词表,分别是主语单词表、谓语单词表和宾语单词表。老师要让小A用这些单词表中的单词来造句, 并且规定:谓语有且仅有一个单词,主语和宾语可以包含任意个单词(主语不可为空)。 老师暂时不想让小A造出能保证意思通顺的句子,他只想让小A能够学会基本的句子结构就行。 现在,小A根据这些单词造了m条句子,现在假设你是老师,你需要判断每条句子是否符合上述句子结构。 输入描述 第一行三个正整数n1,n2,n3,分别表示主语、谓语、宾语单词表的单词数; 第二行包含n1个单词,单词仅由小写英文字母组成,每两个单词之间有一个空格,单词长度不超过10; 第三行包含n2个单词,其他格式同上; 第四行包含n3个单词,其他格式同上; 第五行一个正整数m; 接下来m行,每行一个句子。句子由若干单词(至少一个)组成,并且保证出现的单词都在上面的单词表内。每两个单词之间一个空格隔开。 数据保证一个单词最多只可做一种句子成分。即每个单词仅会出现在一个单词表上。 1≤n1,n2,n3≤1000,1≤m≤20,1≤句子单词数≤10 输出描述 对于每条句子,如果其符合句子结构,输出一行“YES”(不含引号),否则输出一行“NO”(不含引号)。 样例输入 3 3 3 i you he am is are yours his hers 5 i am yours you is his he are hers yours i am am yours is his 样例输出 YES YES YES NO NO */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); final int n1 = scanner.nextInt(); // 主语的单词数量 final int n2 = scanner.nextInt(); // 谓语的单词数量 final int n3 = scanner.nextInt(); // 宾语的单词数量 Set<String> set1 = new HashSet<>(); // 存放主语 Set<String> set2 = new HashSet<>(); // 存放谓语 Set<String> set3 = new HashSet<>(); // 存放宾语 for (int i = 0; i < n1; i++) { set1.add(scanner.next()); } for (int i = 0; i < n2; i++) { set2.add(scanner.next()); } for (int i = 0; i < n3; i++) { set3.add(scanner.next()); } int m = scanner.nextInt(); // 读取的是下面要输入的句子的数量 scanner.nextLine(); // 跳转到下一行去 List<List<String>> data = new ArrayList<>(); for (int i = 0; i < m; i++) { List<String> data0 = Arrays.stream(scanner.nextLine().split(" ")).collect(Collectors.toList()); data.add(data0); } data.forEach(e -> process(set1, set2, set3, e)); } // 要求,谓语只能有一个,主语数量>=1,宾语数量>=0,句子结构严格按照`主谓宾`的结构进行 public static void process(Set<String> set1, Set<String> set2, Set<String> set3, List<String> data0) { int weiYuCount = 0, weiYuIndex = 0; for (int i = 0; i < data0.size(); i++) { final String e = data0.get(i); if (set2.contains(e)) { weiYuCount++; // 如果这个词是谓语的话,那么把谓语的数量++ weiYuIndex = i; // 修改谓语所在的索引 } } // 如果谓语的数量不是1个,return 并输出NO if (weiYuCount != 1) { System.out.println("NO"); return; } // 如果谓语的数量是1个的话... // 如果谓语是句子中的第一个单词,那么输出NO if (weiYuIndex == 0) { System.out.println("NO"); return; } System.out.println("YES"); } }
题目2
import java.util.Scanner; /** * @author wanna * @version v1.0 * @Package com.wanna.main51 * @date 2021/10/19 11:07 下午 */ public class Main { /* @360-2 时间限制: 3000MS 内存限制: 786432KB 题目描述: 一日,小A走在路上时看到路边摆着一面大镜子。他对着这面镜子注视了半天,突然发现自己穿越到了另一个世界! 这个世界很奇怪:他所在的地方可视为一个n行m列的矩阵,每一个位置上都有一个非负整数或者-1。 这时,他的耳边响起了一个很空灵的声音:“如果您想要回到原来的世界,你需要解决下面的问题: 你需要在整个矩阵上选择一个正方形区域,使得该区域不包含任何负数,并且该区域内的数字之和最大。” 然而这个问题对于小A来说还是太难了,所以他请了你来帮忙解决这个问题。 输入描述 第一行一个正整数T,表示一共有T组数据。 对于每组数据,第一行两个正整数n,m,含义见题面; 接下来一个n行m列的整数矩阵aij。 1≤n,m≤500,1≤T≤5,aij∈{-1,[0,100]} 输出描述 对于每组数据,输出一行一个正整数,表示满足条件的最大值。如果该矩阵全为-1,则输出0. 样例输入 1 4 4 3 0 5 6 0 9 -1 4 -1 8 1 1 4 -1 5 -1 样例输出 12 @ AC100% */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); final int T = scanner.nextInt(); // 数据的组数 // 读取T组数据 for (int i = 0; i < T; i++) { final int n = scanner.nextInt(); // 矩阵的行数 final int m = scanner.nextInt(); // 矩阵的列数 int[][] matrix = new int[n][m]; // 矩阵 // 读取矩阵中的数据... for (int j = 0; j < n; j++) { for (int k = 0; k < m; k++) { matrix[j][k] = scanner.nextInt(); } } process(matrix, n, m); // 调用处理函数去进行处理... } } public static void process(int[][] matrix, int n, int m) { int maxSize = Math.min(m, n); // 最大的正方形的边长为m和n的最小值 int max = 0; // 统计最终的最大值,如果遇到了非负数的正方形,那么就需要与当前值判断书否需要进行更新 // 遍历所有的边长的正方形 for (int i = 1; i <= maxSize; i++) { // 边长为i的正方形左上角坐标是[0,n-i],纵坐标是[0,m-i],这样下面进行遍历时就不会有非法的情况了... for (int x = 0; x <= n - i; x++) { for (int y = 0; y <= m - i; y++) { final int check = check(matrix, x, y, i); // 如果check==-1,那么max不变,不然的话,max需要判断是否发生更新 max = check == -1 ? max : Math.max(check, max); } } } System.out.println(max); } // (x,y)对应的是左上角的坐标,size代表的是当前的正方形的大小 public static int check(int[][] matrix, int x, int y, int size) { int sum = 0; // 统计当前正方形中的所有元素之和 boolean flag = false; // 表示是否出现过-1了 // 遍历当前这个正方形中的所有数... loop: for (int i = x; i < x + size; i++) { for (int j = y; j < y + size; j++) { if (matrix[i][j] < 0) { // 如果遇到了负数,那么跳出整个循环 flag = true; break loop; } sum += matrix[i][j]; } } return flag ? -1 : sum; // 如果有负数,那么return -1,不然return sum } }#360笔试##笔经##360公司#