昨天参加了华为的实习笔试,前面一直在在做蓝桥杯的题目,然后下午还在牛客上刷了四个华为的题目,都不难那种,本来挺有信心的。然后拿到题目发现是两个字符串处理的题目。当下就有点蒙,好久不做字符串处理了,手有点生。
第一个题就写了不少时间,直接暴力破解,过了80%。
第二个题目用的递归,但是一开始的时候跳入和跳出的边界考虑的不是很清楚,调试花费了大量的时间,一开始一直是只有20%,然后想去做第三个,一直静不下心来,干脆返回去一直调第二个,结果这一下子忘记了时间。刚改完打算回去提交,发现到了时间。
第三个题目看了看干脆都没有写。
好吧,还是自己的基础功不够牢靠。都是暴力破解,必然耗时费力。还是要去刷LeetCode去啊。
注:
- 感觉做题的过程中最好是保证一个比较安静的环境,我做题的环境有点不理想,感觉自己做题的时候很受打扰,思路很容易断掉。
- 然后就是笔试之前最好是不要刷太多的题,应该给自己留出一个下午的时间来休息一下(感觉考前整俩题练练手就行了,千万不要贪多),我就是考前刷了一下午,然后自己整个人考前感觉特别累,脑子就有点不够用了,下次注意。
- 没有捷径可走,多看书多做题,好好学习天天向上
题目图片来源于网络
题一
我用的是暴力破解,后面和同学讨论可以先用长度对8取余,不够用的补零,然后长度变成8的倍数,然后将之拆开。相比我的方法要好一些,我可low可low的用了好几个循环嵌套,哎呀妈耶四个哈哈哈哈。没有办法,字符串处理好久不用了,见笑见笑了。
import java.util.Arrays;
import java.util.Scanner;
public class Main0410_1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String input[] = new String[n];
for (int i = 0; i < n; i++)
input[i] = in.next();
String[] string = new String[10000];
for (int i = 0; i < 10000; i++)
string[i] = "";
int time = 0;
for (int i = 0; i < n; i++) {
char temp[] = input[i].toCharArray();
for (int j = 0; j < temp.length; j++) {//遍历字符串,这个可以不用的,直接按照字符读取也行
L: for (int k = 0; k < 8; k++) {//每8个生成一个
if (j == temp.length && k < 7) {
int less = string[time].length();
for (int m = 0; m < (8 - less); m++)//补零
string[time] += "0";
break L;
}
string[time] += temp[j];
j++;
}
time++;
j--;
}
}
Arrays.sort(string, 0, time);//升序排列
for (int i = 0; i < string.length; i++) {
if (string[i].equals(""))
break;
if (i != 0)
System.out.print(" ");
System.out.print(string[i]);
}
}
}
题二
这个题目我用的是递归,需要判定好递归的进入条件和跳出条件,遍历到数字进入递归,遍历到右括号跳出递归。
在跳出时需要将累加的字符串按照递归进入的数字来加倍后返回。
需要在遍历的过程中以及跳出的过程中注意保存遍历到的位置,应从最后访问的位置继续遍历。
//这个代码没有提交,不知道能不能AC,感觉应该差不多
import java.util.Scanner;
public class Main0410_2 {
static String string = "";
static int time1 = 0;// 设置静态变量统一遍历位置
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.next();
in.close();
int time = 0;
char temp[] = input.toCharArray();
for (time = 0; time < temp.length; time++) {
if ((temp[time] >= 'a' && temp[time] <= 'z') || (temp[time] >= 'A' && temp[time] <= 'Z'))
string += temp[time];
if (temp[time] <= '9' && temp[time] >= '1') {
string += dsp(temp, time);
time = time1;//统一遍历位置
}
}
char a[] = string.toCharArray();
for (int i = a.length - 1; i >= 0; i--)
System.out.print(a[i]);// 倒序输出
}
public static String dsp(char[] temp, int head) {// 递归进入条件,出现数字
String string1 = "";// 中间值
String string2 = "";// 返回的值
for (int i = head + 2; i < temp.length; i++) {
if (temp[i] <= '9' && temp[i] >= '1') {
time1 = i;
String str2 = dsp(temp, i);
i = time1;
string1 += str2;
}
if (temp[i] != '}' && temp[i] != ']' && temp[i] != ')') {
if ((temp[i] >= 'a' && temp[i] <= 'z') || (temp[i] >= 'A' && temp[i] <= 'Z')) {
string1 += temp[i];
continue;
}
}
if (temp[i] == '}' || temp[i] == ']' || temp[i] == ')') {// 当出现右括号,意味着跳出一层递归
for (int k = 0; k < (temp[head] - '0'); k++)
string2 += string1;
time1 = i; // 为了统一遍历到的位置
return string2;
}
}
return string2;
}
}
题三
这个题目本垃圾就没来得及做这个题。先放个图以后有时间再看看吧