米哈游笔试 记录菜鸡第一次AK
😂都是直接模拟这个过程做,所以代码写得贼多。。
第一题 压缩字符串
一开始考虑很多种情况,然后发现题目已经定好了死规则,一就是有范围的,不然就是字符串或者单个字符,那直接对字符串先小化,然后做一个切分,出现的次数和字符串做好对应。
public static void first() {
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
String[] split = next.toLowerCase().split("\\d+");
char[] arr = next.toCharArray();
int[] splitTime = new int[split.length];
int index = 0;
for (int i = 0; i < split.length; i++) {
index += split[i].length();
int start = index;
int count = 0;
while (index < arr.length && arr[index] >= '0' && arr[index] <= '9') {
index++;
count++;
}
String s = new String(arr, start, count);
splitTime[i] = Integer.parseInt(s);
}
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < split.length; i++) {
firstHelper(splitTime[i], split[i], map);
}
Set<Map.Entry<Character, Integer>> set = map.entrySet();
char result = ' ';
int time = 0;
for (Map.Entry<Character, Integer> entry : set) {
if (entry.getValue() > time) {
result = entry.getKey();
time = entry.getValue();
} else if (entry.getValue() == time) {
if (entry.getKey() < result) {
result = entry.getKey();
}
}
}
System.out.println("" + result + time);
}
public static void firstHelper(int time, String s, HashMap<Character, Integer> map) {
String[] split = s.split("-");
char[] chars;
if (split.length == 1) {
chars = split[0].toCharArray();
} else {
char start = split[0].charAt(0);
char end = split[1].charAt(0);
if (start <= end) {
chars = new char[end - start + 1];
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (start + i);
}
} else {
chars = new char[26 - start + 'a' + end - 'a' + 1];
int index = 0;
while (index < 26 - start + 'a') {
chars[index++] = (char) (start + index);
}
for (int i = 0; i < end - 'a' + 1; i++) {
chars[index++] = (char) ('a' + i);
}
}
}
for (int i = 0; i < chars.length; i++) {
Integer integer = map.get(chars[i]);
if (integer == null) {
map.put(chars[i], time);
} else {
map.put(chars[i], integer + time);
}
}
} 第二题消消乐 暴力模拟
主要有实现两个方法,一个check是遍历全局检查是否可消,并用一个数组记录某点被消,还避免了重复消的问题,最后被消的设0,被消数增加,另一个方法clean就是被消的点上面的还有的点掉落下来,模拟这个过程,重复调用check,clean直到稳定状态
public static void second() {
Scanner scanner = new Scanner(System.in);
int r = scanner.nextInt();
int c = scanner.nextInt();
char[][] arr = new char[r][];
for (int i = 0; i < r; i++) {
arr[i] = scanner.next().toCharArray();
}
int[] first = new int[2];
int[] second = new int[2];
first[0] = scanner.nextInt();
first[1] = scanner.nextInt();
second[0] = scanner.nextInt();
second[1] = scanner.nextInt();
char temp = arr[first[0]][first[1]];
arr[first[0]][first[1]] = arr[second[0]][second[1]];
arr[second[0]][second[1]] = temp;
while (check(arr)) {
clean(arr);
}
System.out.println(count);
}
static int count = 0;
public static boolean check(char[][] arr) {
int[][] ints = new int[arr.length][arr.length];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
char c = arr[i][j];
if (c == '0') {
continue;
}
int ***Count = 0;
boolean flag = false;
for (int k = j + 1; k < arr[0].length && arr[i][k] == c; k++) {
***Count++;
}
if (***Count >= 2) {
flag = true;
for (int k = j + 1; k < arr[0].length && arr[i][k] == c; k++) {
ints[i][k] = 1;
}
}
***Count = 0;
for (int k = i + 1; k < arr.length && arr[k][j] == c; k++) {
***Count++;
}
if (***Count >= 2) {
flag = true;
for (int k = i + 1; k < arr.length && arr[k][j] == c; k++) {
ints[k][j] = 1;
}
}
if (flag) {
ints[i][j] = 1;
}
}
}
boolean flag0 = false;
for (int i = 0; i < ints.length; i++) {
for (int j = 0; j < ints[0].length; j++) {
if (ints[i][j] == 1) {
arr[i][j] = '0';
count++;
flag0 = true;
}
}
}
return flag0;
}
public static void clean(char[][] arr) {
for (int i = arr.length - 1; i > 0; i--) {
for (int j = arr[0].length - 1; j >= 0; j--) {
if (arr[i][j] == '0') {
int index = i - 1;
int nowindex = i;
while (index > 0 && arr[index][j] == '0') {
index--;
}
while (index >= 0 && nowindex > 0) {
arr[nowindex][j] = arr[index][j];
arr[index][j] = '0';
index--;
nowindex--;
}
}
}
}
}
查看10道真题和解析