20190410 华为实习笔试 Java

版权声明:本文为博主原创文章,转载请注明原博客地址 https://blog.csdn.net/qunqunstyle99/article/details/89215213

昨天参加了华为的实习笔试,前面一直在在做蓝桥杯的题目,然后下午还在牛客上刷了四个华为的题目,都不难那种,本来挺有信心的。然后拿到题目发现是两个字符串处理的题目。当下就有点蒙,好久不做字符串处理了,手有点生。


第一个题就写了不少时间,直接暴力破解,过了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;
	}
}

题三

在这里插入图片描述这个题目本垃圾就没来得及做这个题。先放个图以后有时间再看看吧

猜你喜欢

转载自blog.csdn.net/qunqunstyle99/article/details/89215213
今日推荐