HighChat 第二种写法

public String monthData() {
		IP_DT0023 ip_DT0023 = new IP_DT0023();

		ip_DT0023.setDateType(0);
		ip_DT0023.setQueryMonth(queryDate);
		SessionStruct session = (SessionStruct) ActionContext.getContext()
				.getSession().get(CommDataInterface.SESSIONSTRUCT);
		ip_DT0023.setStationId(session.getSelectedStation().getStationId());

		OPFather opFather = TradeCaptain.getInstance().doTrade(ip_DT0023);
		StringBuffer monthStringBuffer = new StringBuffer();

		if (opFather.isSucceed()) {
			OP_DT0023 op_DT0023 = (OP_DT0023) opFather;
			listInverterMonth = op_DT0023.getListMonth();
			monthStringBuffer.append("[");

			if (listInverterMonth == null || listInverterMonth.size() == 0) {
				monthStringBuffer.append("]");
			} else {
				boolean isLastData = false;
				for (int i = 0; i < listInverterMonth.size(); i++) {
					InverterDataRecord4Day inverterMonth = listInverterMonth
							.get(i);
					isLastData = i == (listInverterMonth.size() - 1);
					monthStringBuffer.append(FormatUtil
							.formatPout(inverterMonth.getValue()));
					if (isLastData) {
						monthStringBuffer.append("]");
					} else {
						monthStringBuffer.append(",");
					}
				}
			}

			Calendar cal = new GregorianCalendar();
			SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM");
			try {
				String time = new java.sql.Date(new java.util.Date().getTime())
						.toString();
				cal.setTime(monthFormat.parse(time));
			} catch (ParseException e) {
				e.printStackTrace();
			}

			int monthDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
			StringBuffer dayStringBuffer = new StringBuffer();
			boolean isLastData = false;
			dayStringBuffer.append("[");
			for (int i = 0; i < monthDay; i++) {
				dayStringBuffer.append(i + 1);
				isLastData = (i == monthDay - 1);
				if (isLastData) {
					dayStringBuffer.append("]");
				} else {
					dayStringBuffer.append(",");
				}
			}
			 ActionContext.getContext().put("monthData", monthStringBuffer.toString());
			 ActionContext.getContext()
					.put("dayNum", dayStringBuffer.toString());
			return "monthData";
		}

		return "errorPower";
	}

 

<script type="text/javascript">
	var chart;
	$(document).ready(
			function() {
				chart = new Highcharts.Chart({
					printButton : {
						enabled : false
					},
					chart : {
						renderTo : 'container',
						defaultSeriesType : 'column',
						margin : [ 50, 50, 100, 80 ]
					},
					title : {
						text : ''
					},
					xAxis : {
						categories : eval("${dayNum}"),
						labels : {
							rotation : -45,
							align : 'right',
							style : {
								font : 'normal 13px Verdana, sans-serif'
							}
						},
						title : {
							text : 'Day'
						}
					},
					yAxis : {
						min : 0,
						title : {
							text : 'KWH'
						}
					},
					legend : {
						enabled : false
					},
					tooltip : {
						formatter : function() {
							return 'Energy: '+ Highcharts.numberFormat(this.y, 1)+'KWH'+'<br/>'+'Day: '+this.x;
						}
					},
					series : [ {
						name : 'Population',
						data : eval("${monthData}"),
						dataLabels : {
							enabled : true,
							rotation : -90,
							color : '#FFFFFF',
							align : 'right',
							x : -3,
							y : 10,
							formatter : function() {
								return this.y;
							},
							style : {
								font : 'normal 13px Verdana, sans-serif'
							}
						}
					} ]
				});

			});
</script>

 

<body>
		
		<!-- 3. Add the container -->
		<div id="container" style="width: 800px; height: 400px; margin: 0 auto"></div>
		
				
</body>

 

当然可以!我们可以在你更熟悉的**第一种写法**(使用两个布尔数组 `visited` 和 `onPath`)的基础上,**逐步优化为第二种写法**(使用三状态数组),让你在理解的基础上提升效率。 --- ### ✅ 第一步:回顾你熟悉的写法(第一种) ```cpp class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { vector<vector<int>> graph(numCourses); for (auto& edge : prerequisites) { int from = edge[1], to = edge[0]; graph[from].push_back(to); } vector<bool> visited(numCourses, false); vector<bool> onPath(numCourses, false); bool hasCycle = false; function<void(int)> dfs = [&](int u) { if (hasCycle) return; visited[u] = true; onPath[u] = true; for (int v : graph[u]) { if (!visited[v]) { dfs(v); } else if (onPath[v]) { hasCycle = true; return; } } onPath[u] = false; }; for (int i = 0; i < numCourses; ++i) { if (!visited[i]) { dfs(i); } } return !hasCycle; } }; ``` --- ### ✅ 第二步:引入三状态数组优化 我们用一个数组 `visited` 来替代原来的两个数组 `visited` 和 `onPath`: ```cpp class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { // 构建邻接表 vector<vector<int>> graph(numCourses); for (auto& edge : prerequisites) { int from = edge[1], to = edge[0]; graph[from].push_back(to); } // 三状态数组:0=未访问,1=访问中,2=已访问 vector<int> visited(numCourses, 0); function<bool(int)> dfs = [&](int u) { if (visited[u] == 1) return true; // 发现环 if (visited[u] == 2) return false; // 已处理过,无需重复处理 visited[u] = 1; // 标记为访问中 for (int v : graph[u]) { if (dfs(v)) return true; } visited[u] = 2; // 标记为已访问 return false; }; for (int i = 0; i < numCourses; ++i) { if (visited[i] == 0 && dfs(i)) { return false; // 存在环 } } return true; } }; ``` --- ### ✅ 优化说明(从第一种到第二种) | 原逻辑 | 优化后逻辑 | 说明 | |--------|------------|------| | `visited[u] = true` | `visited[u] == 1 或 2` | 表示是否访问过 | | `onPath[u] = true` | `visited[u] == 1` | 表示是否在当前递归路径上 | | `onPath[u] = false` | `visited[u] = 2` | 表示处理完毕,不再进入 | | 使用两个数组 | 使用一个数组 | 更高效,避免重复访问 | --- ### ✅ 优势总结 - ✅ **效率更高**:每个节点只处理一次,标记为 `2` 后不再进入。 - ✅ **逻辑清晰**:三状态标记法虽然看起来陌生,但本质上是两个布尔数组的合并。 - ✅ **适合大规模图**:不会因为重复访问而超时。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值