LeetCode 42. 接雨水
刷到一个笑话:字节跳动员工是不是个个都会接雨水。顺便记录一下这道题吧。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 1234输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 显然需要算出接满水之后的状态数组,即每一个位置的水面高度,然后减掉原本的柱子高度,对数组求和即可。如何计算水面高度: 如果当前位置的高度大于左右两侧的高度,那么该位置的水面高度就是当前位置的高度,其实就是没有接水; 如果当前位置的高度小于左右两侧的高度,那么该位置的水面高度就是左右两侧的高度中的最小值。 所以问题归结于计算当前位置左侧的最高高度和右侧的最高高度,两次遍历即可。 12345678910111213141516171819202122232425262728class Solution {public: int trap(vector&l...
通过 Python 脚本实现简易回收站
可以通过 Python 脚本实现简易回收站功能,用于在 Linux 服务器中替代 rm 命令,避免文件的误删除。实现原理很简单:将期望删除的文件或目录移动到 ~/.trash 回收站,而非直接删除。 功能说明 文件被移动到 ~/.trash/日期/时分秒-随机数/ 目录下 每月生成独立的日志文件 ~/.trash/YYYYmm-trash.log,记录删除操作 支持文件和目录的移动 自动处理重名冲突(通过随机后缀) 使用方法1python3 rm2trash.py [选项] 文件/目录... 选项 参数 说明 -i, --interactive 删除前逐一确认 -r, --recursive 递归删除目录及其内容(非空目录必须使用) -q, --quiet 静默模式,不输出移动信息 示例1234567891011# 删除单个文件python3 rm2trash.py test.txt# 递归删除目录(非空必须加 -r)python3 rm2trash.py -r my_folder/# 交互式删除,逐个确认python3 rm2trash.py -i f...
通过 Python 脚本发送邮件
在日常的命令行操作中可能存在通过邮件通知的需求,但是不同平台自带的邮箱工具无法统一,可以基于 Python 脚本实现跨平台的统一操作。 脚本内容sendmail.py123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155#!/usr/bin/env python3import argparseimport smtplibfrom e...
密码学笔记——RSA算法
整理一下RSA算法的内容,主要参考维基百科。 对称加密与非对称加密首先从对称加密开始,Alice和Bob需要进行加密的通信,Alice传递信息 $m$ 给Bob。 为了信息安全,Alice首先用字母表替换的方式 $A$ 将明文m变成密文 $m’=f_A(m)$,然后通过公开方式传递给Bob,Bob使用同样约定好的字母表替换方式 $A$ ,将收到的密文 $m’$ 变成明文 $f_A^{−1}(m’)=f_A^{−1}(fA(m))=m$ 。 这里我们对信息都视作字符串,从而字母表替换规则 $A$ 实际上定义了字符串到字符串的加密函数 $f_A$ 和解密函数 $f_A^{−1}$ ,这里加密函数和解密函数都是通过 $A$ 决定的,并且极容易从其中一个推出另一个,因此双方都必须保管好密码本 $A$ 。 例如,使用替换的字母表 $A$ 为 11->3, 2->4, 3->2, 4->1 用轮换的记号就是$(1324)$,此时的加密函数 $f_A$ ,明文$1234$,密文 $f_A(1234)=3421$。同时得到...
C/C++ 练习——实现终端进度条
记录一下通过 C 语言和 C++ 实现在终端中展示进度条的动画效果,代码同时支持 Linux 和 Windows。 C 语言实现头文件如下 pbar.h12345678910111213141516171819202122#ifndef PBAR_H#define PBAR_H#ifdef __cplusplusextern "C" {#endifstruct pbar *pbar_create();struct pbar *pbar_create_colorful();struct pbar *pbar_create_simple();struct pbar *pbar_create_simple_colorful();void pbar_update(struct pbar *pb, double pct);double pbar_time_cost(struct pbar *pb);#ifdef __cplusplus}#endif#endif // PBAR_H 这里导出的接口同时支持 C 和 Cpp。 具体实现的源文件如下 p...
通过 Python GUI 实现进度监控
使用 Python Tkinter 实现的 GUI 工具,用于监控科学计算程序的日志文件,提供进度展示与统计功能。 背景在科学计算程序运行过程中,了解进度信息十分重要。但是大部分科学计算程序(如 C/C++/Fortran 编写的程序)无法直接提供图形化的进度条。可采用间接方法:让计算程序将时间戳和进度(例如 [2024-07-28 23:24:46.769] 4.17%)写入日志文件,然后通过本工具监控该文件。这样做的好处是:科学计算程序与进度监控过程相分离,简化了计算程序的编写,并避免了对输出内容的干扰。 主要功能 实时展示日志:类似 tail -f 命令,实时显示日志文件新增内容。 解析与展示进度:自动解析时间戳(格式为 [2024-07-28 23:24:46.769])和进度百分比(格式为 0-100%),并以进度条形式展示。 时间预测:基于当前进度和历史数据,通过指数平滑预测剩余时间及完成时间。 关键字检测: 自动检测 error、warning、inf、nan 等关键字,显示并计数错误/警告信息。 检测 end 或 finish 关键词...
Docsify 搭建记录
需要一个小型的在线文档系统,Docsify 可以满足需求,记录一下搭建记录,主要 Docsify 官方的中文文档。 本地搭建 前提:本地需要安装 nodejs 并完成相应配置。 全局安装 docsify-cli 1npm i docsify-cli -g 初始化项目 1docsify init ./docs 初始化过程会自动新建 ./docs 子文件夹,并生成如下文件: index.html:项目入口 README.md:内容会被渲染成项目主页 .nojekyll:防止 Github 忽视下划线开头文件 使用下面的命令可以在本地预览 123cd ./docsdocsify serve# or docsify s 这会在本地部署一个网站,通过 http://localhost:3000 访问。 自动生成的 index.html 文件默认内容如下 12345678910111213141516171819202122<!DOCTYPE html><html lang="en"><head> <meta cha...
Cpp 基础笔记整理
一些零散的不同主题的 Cpp 基础笔记,单独拆开显得内容太少,干脆整理到一起。 类型别名typedeftypedef是用于为类型定义别名的关键字,在C和C++中都可以使用。 最简单的用法是对基本类型起别名,例如 1typedef int Length; 下面的是MSVC的stdint.h中的部分源码,对基本数据类型起了意义更明确的别名 12345678typedef signed char int8_t;typedef short int16_t;typedef int int32_t;typedef long long int64_t;typedef unsigned char uint8_t;typedef unsigned short uint16_t;typedef unsigned int uint32_t;typedef unsigned long long uint64_t; 数组类型和指针类型可以通过typedef起别名达到简化语法和提升可读性...
Linux 学习笔记:控制台,终端,tty
整理一下关于下面这些概念的学习: 终端(terminal) 控制台(console) 电传打字机 tty(teletype) 这些概念在早期是有明确的定义的,但是随着计算机的发展,它们的物理实体逐渐消失,各种概念主要靠计算机软件模拟,它们之间的区别变得模糊难以理解,因此学习整理一下,以 Linux 系统为主。 TODO shell 控制台与终端早期的计算机是一套巨大的机器,就像工厂的大型机器一样,如此的庞然大物必然需要一个专门的操作台,用于陈列各种仪表盘、指示灯、按钮、电线,专业操作人员通过这个操作台控制计算机的启动、运行、停止,结果也会实时反馈到操作台,这个操作台就叫“控制台”(console)。 控制台是附着在机器上的设备,可以实现对计算机的完全操控,但是主要是用来管理计算机的。对于多用户操作系统(特别是 UNIX),控制台并不方便给用户提供计算服务。因此自然产生了终端(terminal)的硬件概念:每个用户通过终端设备与主机远程连接(还不是现代意义上的基于互联网的远程连接),管理员给每个用户分配一个账户,用户“登录”到系统获得计算机使用权。在这个阶段,计算机通常只有...
Cpp 并行计算学习笔记
基本概念首先学习几组基本概念: 同步(Synchronous)/异步(Asynchronous) 并发(Concurrency)/并行(Parallelism) 进程(Process)/线程(Thread) 同步 / 异步 同步是指任务按照顺序依次执行,每个任务在前一个任务完成后开始执行。在同步模式中,任务之间需要等待其他任务完成才能继续执行。 异步是指任务可以独立于其他任务进行执行,它们的执行过程不会产生堵塞。在异步模式中,任务可以在后台执行,执行结果可能需要等待一段时间才能获得,但这不会影响其他任务的执行。 举个例子: 手洗衣服的流程是同步的:先将衣物放入盆中,再加入洗衣粉,然后开始洗衣,等到洗衣完成,最后取出衣物晾干或烘干,每一步的开始都依赖于前一步的完成,在过程中也干不了其他事。 使用洗衣机洗衣服是异步的:将衣物放入洗衣机并启动,洗衣机开始运作,此时人不需要等待在洗衣机旁,可以干其它任何事,等到洗衣机完成后会发出通知,然后取出衣物晾晒即可,当然也可以选择等在一边,不干其他事。 并发 / 并行 并发指的是多个任务在...
