力扣日记 cpp 150 239 347 71

力扣日记 cpp 150 239 347 71

150 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

后缀表达式求值是前后中里面最简单的。

class Solution { public: stack<int> data; int evalRPN(vector<string>& tokens) { int ans; int source1, source2; for (string str : tokens) { if (str == "+" || str == "-" || str == "*" || str == "/") { source1 = data.top(); data.pop(); source2 = data.top(); data.pop(); if(str == "+") data.push(source1 + source2); if(str == "-") data.push(source2 - source1); if(str == "*") data.push(source1 * source2); if(str == "/") data.push(source2 / source1); } else { data.push(stoi(str)); } } return data.top(); } };

239 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

给出最大堆版本的和优先队列版本的,本质上都是堆。优先队列表征出了一个单调递减队列,会动态维护队列中元素。具体方法为:如果元素入队后队列符合单调递减,则入队;如果元素入队后不符合单调递减,则队尾不断出队,直到符合条件后停止淘汰队尾,然后元素入队。因为需要的是top1不是topk,所以使用优先级队列更好。

class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int length = nums.size(); priority_queue<pair<int, int>> maxheap; for (int i = 0; i < k; i++) { maxheap.push({nums[i], i}); } int left = 0, right = k; vector<int> res; res.emplace_back(maxheap.top().first); while (right < length) { left++; if (right != length) maxheap.push({nums[right], right}); right++; while (!maxheap.empty() && maxheap.top().second < left) { maxheap.pop(); } res.emplace_back(maxheap.top().first); } return res; } }; 
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int length = nums.size(); vector<int> res; deque<int> q; for (int i = 0; i < length; i++) { while (!q.empty() && nums[q.back()] < nums[i]) { q.pop_back(); } q.push_back(i); if (q.front() < i - k + 1) q.pop_front(); if (i >= k - 1) res.emplace_back(nums[q.front()]); } return res; } };

347 前K个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

需要注意,在pair里面,频率是first,元素是second。这样的话可以顺水推舟greater缺省按照字典序排序。否则需要自行制定比较方法。

class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { vector<int> res; unordered_map<int, int> m; using Node = pair<int, int>; // frequency, element. priority_queue<Node, vector<Node>, greater<Node>> q; for (int num : nums) { m[num] += 1; } for (auto it = m.begin(); it != m.end(); it++) { q.push({it->second, it->first}); if (q.size() > k) q.pop(); } while (!q.empty()) { res.emplace_back(q.top().second); q.pop(); } return res; } };

71 简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径

在 Unix 风格的文件系统中规则如下:

  • 一个点 '.' 表示当前目录本身。
  • 此外,两个点 '..' 表示将目录切换到上一级(指向父目录)。
  • 任意多个连续的斜杠(即,'//' 或 '///')都被视为单个斜杠 '/'
  • 任何其他格式的点(例如,'...' 或 '....')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/' 。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。

可以使用size_t类型存储位置和判断string::npos,更优雅,此处未使用。需要注意erase和length之间的动态关系。

class Solution { public: string simplifyPath(string path) { int length = path.size(); if (path[length - 1] == '/') path.erase(length - 1, 1); for (int i = 0; i < path.size(); i++) { if (i > 0 && path[i] == '/' && path[i - 1] == '/') { path.erase(i - 1, 1); i--; } } stack<string> s; int start = 0, end = 0; int newlength = path.size(); for (int i = 0; i < newlength; i++) { if (path[i] == '/') start = i; if (i == newlength - 1 || path[i + 1] == '/') end = i; if (start < end) { string sub = path.substr(start, end - start + 1); if (sub == "/.") { // nop. } else if (sub == "/..") { if (!s.empty()) { s.pop(); } } else { s.push(sub); } } } string; while (!s.empty()) { res = s.top() + res; s.pop(); } if (res == "") return "/"; return res; } };

Read more

国产替代不掉链子:KingbaseES如何做到MySQL零感迁移

国产替代不掉链子:KingbaseES如何做到MySQL零感迁移

前言 在信创国产化的大趋势下,数据库作为数字基础设施的核心,其替代迁移工作成为企业数字化转型的关键环节。MySQL 作为国内企业应用最广泛的开源关系型数据库之一,凭借轻量、易用、生态完善的特点,在互联网、金融、政务、制造等多个行业落地生根。但不少企业在将 MySQL 向国产数据库迁移的过程中,却陷入了 “看似简单,实则踩坑” 的困境 —— 表面上的语法兼容背后,是 JSON 数据类型行为差异、事务隔离级别在高并发下的隐性适配问题、Group By 严格模式等细节带来的兼容性故障,甚至出现 “改一行代码,崩整个系统” 的极端情况。 业务方对迁移的核心顾虑,从来都不是 “能不能迁”,而是 “能不能稳迁、低成本迁、不影响业务迁”。本文将从 MySQL 迁移的核心痛点出发,深度解析电科金仓 KingbaseES 的 MySQL 兼容性技术实现,以及全流程迁移工程的落地能力,为企业 MySQL

By Ne0inhk
KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

前言: 随着 5G 和物联网技术的普及,车联网 (Internet of Vehicles, IoV) 正成为数据爆发的新战场。与传统的静态传感器不同,车辆是移动的计算节点,它们每时每刻都在产生海量的时间序列数据:从 GPS 经纬度到发动机转速,从剩余油量到刹车踏板状态。 对于一家拥有数百辆货车的物流公司而言,这些数据就是金矿。通过实时监控,可以有效降低油耗、杜绝违规驾驶、优化配送路线。然而,传统的关系型数据库在面对车辆高频上报(例如每秒 10 次)的轨迹数据时,往往面临写入瓶颈;而单纯的时序数据库又难以处理复杂的车辆档案关联查询。 KWDB (KaiwuDB) 的“多模”特性恰好解决了这一痛点。今天,我们将实战构建一个物流车队实时监控平台,挑战如何在一个数据库内同时搞定“车辆档案管理”与“海量轨迹分析”。 场景设定:我们要为一个拥有 200 辆货车的物流车队构建监控系统。 核心挑战:高频写入:车辆每 10

By Ne0inhk
Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos) 在高性能移动应用开发中,本地数据的持久化存储效率往往是决定用户感知流畅度的木桶短板。传统的 SQLite 虽然结构化程度高,但在处理大规模对象关系映射(ORM)时,复杂的 SQL 拼接和反射解析往往会成为性能瓶颈。 ObjectBox 作为一个专为移动设备打造的、跨平台的超高速 NoSQL 数据库,已经成为了许多追求极致体验开发者的首选。而在 Flutter for OpenHarmony 开发中,配合 objectbox_generator,我们可以通过注解驱动的自动化流程,掌握这套高性能数据库的核心用法。 ⚠️ 鸿蒙适配现状提示:截至本文撰写时,ObjectBox 的 Dart 插件尚未提供官方的 OpenHarmony

By Ne0inhk
YOLO可视化界面,目标检测前端QT页面。

YOLO可视化界面,目标检测前端QT页面。

使用PySide6/QT实现YOLOv8可视化GUI页面 在人工智能和计算机视觉领域,YOLO(You Only Look Once)是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果,我们可以使用Python中的PySide6库来创建一个简单的GUI应用程序,将检测结果实时可视化。 本文将指导你如何使用PySide6实现这一功能。 1. 原视频/图片区:上半部分左边区域为原视频/图片展示区; 2. 检测区:上半部分右边区域为检测结果输出展示区; 3. 日志文本框:打印输出操作日志; 4. 加载模型:从本地选择模型pt文件进行加载; 5. 置信度阈值:自定义检测区的置信度阈值; 6. 文件上传:选择目标文件; 7. 开始检测:执行检测程序; 8. 停止:终止检测程序; 一、工具介绍 1、PySide6 PySide6是一款功能强大的GUI(图形用户界面)开发框架,它允许Python开发者使用Qt库的功能来构建跨平台的桌面应用程序。PySide6作为Qt的Python绑定版本,继承了Qt的跨平台特性,支持在Windows、

By Ne0inhk