LeetCode 周赛-291

第一题1 问题描述 给你一个表示某个正整数的字符串 number 和一个字符 digit 。 从 number 中 恰好 移除 一个 等于 digit 的字符后,找出并返回按 十进制 表示 最大 的结果字符串。生成的测试用例满足 digit 在 number 中出现至少一次。 示例1: 输入:number = "123", digit = "3" 输出:"12" 解释:"123" 中只有一个 '3' ,在移除 '3' 之后,结果为 "12" 。 示例2: 输入:number = "1231", digit = "1" 输出:"231" 解释:可以移除第一个 '1' 得到 "231" 或者移除第二个 '1' 得到 "123" 。 由于 231 > 123 ,返回 "231" 。 示例3: 输入:number = "551", digit = "5" 输出:"51" 解释:可以从 "551" 中移除第一个或者第二个 '5' 。 两种方案的结果都是 "51" 。 提示:...

May 1, 2022 · Huo Haodong

阿拉伯数字转中文

初步想法 下面是一些将阿拉伯数字转为中文的例子: 0 = 零 10 = 十 1000 = 一千 9527 = 九千五百二十七 10051 = 一万零五十一 111111111 = 一亿一千一百一十一万一千一百一十一 一个最直观的想法就是按照从最低位到最高位的顺序,依次将数字映射为相应的中文字符并加上单位,比如: 0 = 零 10 = 一十零 1000 = 一千零百零十零 10051 = 一万零千零百五十一 110010 = 一十一万零千零百一十零 210010 = 二十一万零千零百一十零 但是这样的转换方法对于“零”的处理并不理想,我们中文的习惯一般是将连续出现的多个“零”合为一个,并去除末尾的“零”。因此我们需要对“零”进行单独处理。 此外,对于数字 110010 最高位的 11 而言,我们一般是读成“十一万”而不是“一十一万”,所以还应对位于开头的 10 ~ 19 之间的数字进行处理。 观察上面的例子也很容易注意到,按照这种朴素的处理方法,添加“万”、“亿”等特殊数位的时机也是一个棘手的问题。 通过上述分析可以看到,阿拉伯数字转中文并没有一个统一的规则,且因为中文的阅读习惯比较特殊,还应进行许多特殊处理。 算法设计与实现 以数字 123456789 为例,我们可以将数字从右到左按照每 4 位为一段进行单独处理,之后对每段处理后的结果进行拼接: 将 123456789 分为 1、2345、6789 三段,每段单独处理; 6789 = 六千 七百 八十 九,2345 = 二千 三百 四十 五,1 = 一; 对结果进行拼接,注意拼接的时候带上每段相应的数位,比如“万”和“亿”,拼接后为:一 亿 二千三百四十五 万 六千七百八十九。 按照这样的规则处理就可以解决“万”、“亿”等特殊单位的添加问题。...

March 13, 2022 · Huo Haodong

服务器上实现校园网账号的登录/登出

校园网账号的登录/登出操作在本质上是本机向校内的认证服务器发送了一个含有校园网账号和密码、DHCP 服务器为本机分配的内网 IP,本机的 MAC 地址等信息的网络请求。想要在无图形界面的服务器上实现校园网账号的登录/登出首先需要获取校园网认证服务的 API 接口地址和参数列表。 首先使用浏览器(这里使用网络工具更好用的 Firefox)打开校园网登录界面,F12 打开开发者工具,找到网络一栏。 开发者工具的网络一栏可以实时拦截并解析网页中发送和接收的网络请求,此时输入账号密码并点击登录后即可获得所有相关的网络请求链接。 可以通过过滤 URL 的方式寻找和登录(login)有关的关键字来查找相关网络请求,可以看到这里第一个请求就是校园网账号登录操作的 URL 链接。 浏览器的开发者工具一般都会为每个请求链接提供 cURL 命令格式的复制选项,根据服务器所在的平台不同,复制相应的 cURL 命令即可。由于服务器运行的是 Linux,这里采用 POSIX 标准的命令进行复制。 复制得到的命令中的一些琐碎的参数可以去除,留下关键的参数即可。 原始命令 curl 'https://w.seu.edu.cn:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=校园网账号&user_password=校园网密码&wlan_user_ip=DHCP服务器为本机分配的内网IP&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.2&v=4680' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0' -H 'Accept: */*' -H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Referer: https://w.seu.edu.cn/' -H 'Cookie: PHPSESSID=iallep4oe53qg6uc5osr6ir99e' -H 'Sec-Fetch-Dest: script' -H 'Sec-Fetch-Mode: no-cors' -H 'Sec-Fetch-Site: same-site' 精简后的命令 curl 'https://w....

March 8, 2022 · Huo Haodong

博客迁移

20年年初的时候阿里云云翼计划额外赠送了一次学生机购买机会,正好疫情期间在家上网课很无聊,索性就花了亿点时间折腾了一下博客。🤔既然是采用云服务器来部署博客,静态博客这种肯定是不合适的。而市面上可选自部署博客服务的方式太多了,诸如WordPress这类成熟的方案简直是傻瓜操作,一键部署搞定。挑了半天,综合考虑了可玩性和易用性,最后选择了 typecho来搭建博客服务,博客主题选用了代码和文档质量高到不可思议的handsome主题。但折腾总归是折腾,折腾到最后都是索然无味🙃。 坚持写了一年多的博客,对于服务器续费的事情早就习以为常。没想到前几天邮箱突然遭到阿里云轰炸,阿里云预付的0.01个达不溜竟然无法续费服务器了,起初以为是bug,最后才发现是学生机优惠续费有次数限制🤡,续费一次的成本直接翻了几十倍,成本过高,于是便想着这几天忙完毕业的事情就把博客迁移到成本更低的静态博客上。 这次博客迁移实际上只用了一下午,但是技术选型和博客风格倒是考虑了几个星期。之前采用的旧博客虽然什么都好,但是有几点还是让我很膈应的。 首先,typecho本质上是个多用户类型的博客服务,每次用markdown写完的文章还需要手动登录账号去后台提交,太过麻烦,因此新博客的第一个要求就是博客提交体验要好。 其次,杜绝一切花里胡哨。这不是说之前的博客太花里胡哨,而是我对博客的需求变了,之前只是为了无聊的时候找找乐子,现在是为了找个地方存放读书笔记和技术文章。博客在文字排版和渲染性能不妥协的前提下,越简洁越好,换句话说就是够用就行。 最后,新博客的容灾性能要高且方便未来的迁移。 其实提这些需求完全等于在报Github Pages+Hugo/Hexo/Vuepress等方案的身份证。Github Pages的静态托管服务区完全满足上述所有需求,接下来要纠结的只剩静态博客生成引擎和主题的选择了。 起初我想用采用Vuepress的方案,在折腾过后还是决定不合适,Vuepress本身还是偏向于项目文档的托管,对于博客这种需求其本身就没有提供合适的解决方案。Hexo的话则是完全为博客需求量身定做,NexT主题也是非常有名,但是综合考虑到配置的复杂程度、模板引擎的性能、提交体验等多个方面,最后还是选择了Hugo。 Hugo完全不需要自己去定义导航栏的一些信息,在markdown文件头部加入文章题目、标签、分类等信息后模板引擎会自动生成对应的导航信息,十分方便。提交体验也是非常好,每次写文章只需要使用Hugo来生成新文章,写完后生成模板提交到Github上即可。(这里其实有更好的方案,使用Github Action脚本可以实现自动模板内容的自动生成,省事了不少)。主题的话则是采用了简洁且够用的PaperMod主题,性能强悍,markdown渲染引擎支持各类主流/非主流语法,出乎意料的强悍。 不出意外的话,这次迁移之后应该可以稳定相当长的一段时间了,其实一开始就该采用这种方案的,不折腾又稳定,希望能坚持写下去吧。

May 23, 2021 · Huo Haodong

cflib 的基本使用方法

Bitcraze官方提供了名为cflib的Python库来对无人机进行操作,下面介绍一些诸如飞行控制、获取log信息等基本操作的实现方法。 连接Crazyflie 我们通过URI*(Uniform Resource Identifier)*来标识Crazyflie无人机,其中URI的格式为:InterfaceType://InterfaceId/InterfaceChannel/InterfaceSpeed 例如:URI为radio://0/3/2M,其中: radio标识通过无线信号的方式(PA)来连接; 0标识是在电脑上标识为0号的无线设备; 3标识该设备在该连接设备下的频道; 2M标识无线信号的频率。 想要连接无人机的话,首先要初始化驱动(USB或者PA) cflib.crtp.init_drivers() 驱动初始化后便可以对每个接口进行扫描 available = cflib.crtp.scan_interfaces() 扫描操作会使用当前存在的连接设备(USB或者PA)来对可以通过该设备访问到的无人机进行扫描并以List的形式返回。 下面的操作用来连接第一个扫描到的无人机: import cflib.crtp from cflib.crazyflie import Crazyflie def connected_callback(link_uri): print("连接到了无人机") if __name__ == '__main__': # 初始化驱动 cflib.crtp.init_drivers() available = cflib.crtp.scan_interfaces() FIRST_LINK_URL = "" if len(available) > 0: FIRST_LINK_URL = available[0][0] else: print("没有扫描到无人机") cf = Crazyflie() cf.open_link(FIRST_LINK_URL) cf....

May 23, 2021 · Huo Haodong