今日头条2017春招笔试题——绘制括号序列

(注:题解来自于“今日头条校园”微信公众号)


题意:给定一个合法的括号序列,以字符矩阵的形式翻转后输出。

题解:先预处理每一个括号的深度,从而推出应打印的括号的大小,剩下的就是扫一遍处理下打印细节了。


Java代码实现:

import java.util.LinkedList;
import java.util.List;

public class Test {

	// 括号绘制函数,numDraw用于控制绘制长度
	// drawFlag 控制绘制类型:true表示这一行的中间是--- false表示这一行的中间是空格
	public static String drawBracket(int numDraw, boolean drawFlag, int maxLevel) {
		String result = "";
		int drawWidth = (maxLevel - numDraw) * 2;
		// 绘制对齐用的空格
		for (int i = 0; i < numDraw - 1; i++) {
			result += " ";
		}
		// 绘制主体(绘制一行的左端)
		result += "|";
		// 如果drawFlag 为true,则绘制一行(比如: +-----+)
		if (drawFlag) {
			result += "+";
			for (int i = 0; i < drawWidth - 1; i++) {
				result += "-";
			}
			result += "+";
		} else {
			// 如果drawFlag 为false,则绘制空格(比如: )
			for (int i = 0; i < drawWidth + 1; i++) {
				result += " ";
			}
		}
		result += "|";
		return result;
	}

	// 边缘线绘制函数,参数用于控制绘制的长度
	public static String drawLine(int numDrawLine, int maxLevel) {
		String result = "";
		// 绘制对齐用的空格
		for (int i = 0; i < numDrawLine; i++) {
			result += " ";
		}
		int drawWidth = (maxLevel - numDrawLine) * 2;
		// 绘制直线主体
		result += "+";
		for (int i = 0; i < drawWidth - 1; i++) {
			result += "-";
		}
		result += "+";
		return result;
	}

	public static void main(String[] args) {
		String strInput = "[[[][[]]]][]";
		int length = strInput.length();
		// 数据预处理
		char strLeft = '[';
		char strRight = ']';
		// 最大嵌套层数
		int maxLevel = 0;
		int tempLevel = 0;
		List<Integer> levelList = new LinkedList<Integer>();
		// 在最前面多加了一个0!
		levelList.add(0);
		for (int i = 0; i < length; i++) {
			if (tempLevel > maxLevel) {
				maxLevel = tempLevel;
			}
			if (strInput.charAt(i) == strLeft) {
				tempLevel += 1;
			}
			if (strInput.charAt(i) == strRight) {
				tempLevel -= 1;
			}
			levelList.add(tempLevel);
		}


		for (int i = 0; i < levelList.size(); i++) {
			// 括号边缘判断,首尾的括号边缘只需要绘制一次,内部的边缘绘制两次
			if (levelList.get(i) == 0) {
				// 如果是第一个或者最后一个,单独处理
				if (i == 0 || i == length) {
					System.out.println(drawLine(0, maxLevel));
				} else {
					System.out.println(drawLine(0, maxLevel));
					System.out.println(drawLine(0, maxLevel));
				}
			} else {
				// 如果不是括号边缘

				// 判断是否为最小括号组,如果是,绘制括号组;否则绘制边缘
				if (strInput.charAt(i - 1) == strLeft && strInput.charAt(i) == strRight) {
					System.out.println(drawBracket(levelList.get(i), false, maxLevel));
					System.out.println();
					System.out.println(drawBracket(levelList.get(i), false, maxLevel));
				} else {
					if (strInput.charAt(i - 1) == strRight && strInput.charAt(i) == strLeft) {
						System.out.println(drawLine(levelList.get(i), maxLevel));
						System.out.println(drawLine(levelList.get(i), maxLevel));
					} else {
						System.out.println(drawBracket(levelList.get(i), true, maxLevel));
					}
				}
			}
		}
	}
}


参考资料:https://github.com/WattZhang/draw_bracket

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值