AcWing-124-进制转换
原题链接
将一个 a 进制数转换成一个 b 进制数。思路在于模拟一个 a 进制数直接对一个十进制数 b 做除法。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <iostream>using namespace std;#include <algorithm>int n;int main() { cin >> n; while (n--) { int a, b; string a_line, b_line; cin >> a >> b >> a_line; vector<int> num; for (auto &x : a_line) { if (x >= 'A' && x <= 'Z') { n ...
初级工程师
怕写类
怕写算法
科技公司和服务业
和电脑挂钩的企业就是科技公司吗?我认为不是的,很可能是一家做服务业的公司。互联网公司都是科技公司吗?我认为也不是,更像是服务业。
马斯克的星链计划和火箭属于科技吗?核物理造原子弹属于科技吗?华为的 5G 是科技吗?拼多多买菜、抖音、淘宝、蚂蚁金服呢?以接项目为生的软件外包公司呢?
后者统统是披着科技公司外皮的服务业、金融业。
一家科技公司,必定要上升到科学的第二层次甚至第一层次。实现宏伟的蓝图不可能光靠第四层的各种排列组合,一定需要大量处于第二层次、第一层次的人才。
有人可能会说,某某公司一直在做第四层的事,也赚得盆满钵满,我想说,这样的蓝图不够宏伟。
当今中国的科技公司,一直在挣扎在低技术、低端重复的泥潭,也就是第四层。
没有自己的操作系统,没有自己的芯片,也没有自己的浏览器,也曾冲击过第一层次、第二层次,搞出过汉芯事件这种骗局。
谈创新与民科
关于民科的定义:民科是指科学共同体之外进行所谓科学研究的一个特殊人群,他们或者希望一举解决某个重大的科学问题,或者试图推翻某个著名的科学理论,或者致力于建立某种庞大的理论体系,但是他们却不接受也不了解科学共同体的基本范式,与科学共同体不能达成基本的交流。总的来说,他们的工作不具备科学意义上的价值。
哥白尼在提出日心说之前彻底研读了托勒密的地心说理论。
牛顿在提出万有引力概念之前分析了哥白尼的日心说和开普勒三定律。
爱因斯坦在创立相对论之前学完了所有经典力学。相对论能够兼容经典力学,因为在低速运动的世界,质量加成和时间加成可以忽略不计。
以上例子和科学界的发展,说明了创新源自对现有理论和基本问题的深入思考,重视前人的经验和理论。
举一个创新的反例:区块链概念。
彻底抛弃现有互联网,企图构造一个想象中的新世界,最终的结果就是不成气候,用的人很少。
那你是在做行业创新还是在搞民科?
科学的分层
我将科学分为四个层次。
科学的四个层次
基本原理
技术原理
工艺流程
排列组合
拿物理学举例:
发现基本粒子属于探索基本原理
研究粒子构成物质的结构和特性属于技术原理
已知某种物质的结构和特性可以解决一类问题,将解决问题的流程进行工业化属于工艺流程
流水线上的工人使用各种成熟的产物进行排列组合,解决一个特定的问题属于排列组合
再拿计算机举例:
发明快速排序算法发表论文属于探索基本原理
将论文描述的算法实现并进行优化属于技术原理
已知快速排序算法是目前最快的排序算法,将其封装成类库是工艺流程
低水平码农不懂排序,调用类库对自己的数据排序
第一层和第二层的工作大多由研究院在做,第三层和第四层的工作一般由公司来做,当然也有设立研究院的公司在做第二层的事情。
试问,你在第几层?
转移指令的原理
可以修改 IP,或同时修改 CS 和 IP 的指令统称为转移指令。控制 CPU 执行内存某处代码的指令。
8086CPU 转移行为:
段内转移:只修改 IP,例:jmp ax。
段间转移:同时修改 CS 和 IP,例:jmp 1000:0。
段内转移分短转移和近转移。
短转移 IP 的修改范围:-128 ~ 127
近转移 IP 的修改范围为:-32768 ~ 32767
8086CPU 转移指令分类:
无条件转移指令,例:jmp
条件转移指令
循环指令,例:loop
过程
中断
操作符 offset
offset 是由编译器处理的符号,用于取得标号的偏移地址。
123456assume cs:codesgcodesg segment start: mov ax, offset start s: mov ax, offset scodesg endsend start
offset 操作符取得标号 start、s 的偏移地址 0 和 3。
jmp 指令
jmp 为无条件转移指令,可以只修改 IP 也可以同时修改 CS 和 IP。
jmp 指令要给出两种信息: ...
三观
在讨论三观之前,先给出一种三观的定义。
三观是价值观、人生观、世界观。
价值观:决定做不做某事最直接的内在驱动力。
人生观:自己的一生将如何度过,人活着是为了什么。
世界观:如何看待世界,对世界运行规则的理解。
我们来看一种正向循环的三观:
价值观:金钱。
人生观:权力。
世界观:有金钱和权力的人支配其他人做事。
如果一个人有这样三观,便能形成正向循环,促使他一步步迈向目标。他决定做不做某事最直接的内在驱动力就是这件事是否能带来金钱,他的人生意义就是登上权力的巅峰,他认为世界上有钱有权的人支配其他人做事。可见三观应当有机结合,逻辑自洽,形成一个正向循环,才能拉动人不断实现目标,取得成功。
我们来看一个反例:
价值观:简单的事。
人生观:成为人上人。
世界观:世界充满爱。
如果一个人有这样的三观,便会精神分裂,他将原地踌躇,无法走向任何一个方向。他决定做不做某事最直接的内在驱动力就是这件事简不简单,他的人生意义却是成为人上人,他还认为世界充满爱。这样的三观自相矛盾,逻辑不通,就像三个不同方向的力作用在一个人身上,结果就是哪里也去不了。
如何学习
从基本定义出发。在进行演绎推理之前,一定要明确基本定义。
第一性假设,第一性原理强调从最基础的公理和/或基石假设出发,演绎推理整个理论体系和模型。古希腊哲学家亚里士多德这样定义:在每一系统的探索中,存在第一原理,是一个最基本的命题或假设,不能被省略或删除,也不能被违反。
若干个基本定义构成一个低层次的概念,若干低层次概念构成一个高层次概念,若干个高层概念组成整个知识体系。基本定义是叶子节点,低层概念是枝叶节点,高层次概念是根节点。
若干棵树的节点之间互相连接,那么整个知识体系就是一个森林。
任何命题的证明源自基本定义,一切结论隐藏在已知。先对复杂的命题进行拆解,转化成若干相关的高层次概念,再将高层次概念转化成若干低层次概念,最后回归基本定义,推演出结论。
若干高层次概念之间能够形成定理,记住定理可以加速解决问题。
学习定理的证明思路可以增强分析能力,能够通过已知条件演绎推演其他结论。
学习定理的使用可以快速解决实际问题。
如果只会使用定理而不会演绎推理,那么不能掌握解决复杂的问题的基本方法。
每日打卡-LeetCode-401-二进制手表
原题链接
枚举每一种亮灯状态,如果当前亮灯的数目等于 num,而且当前表示的时间合法,就记录下来。
1234567891011121314151617181920212223242526class Solution { public: vector<string> readBinaryWatch(int num) { vector<string> res; char str[10]; for (int i = 0; i < 1 << 10; i++) { int s = 0; int b = i; // 使用 lowbit 快速计算二进制中 1 的个数 while (b) { s++; b = b & (b - 1); } if (s == num) { int h = i >> 6; int m = i & 63; ...
每日打卡-LeetCode-483-最小好进制
最小好进制
n 可以表示成由 m 个 1 组成的 k 进制数:n=(11⋯1⏟m 个)kn = (\underbrace{11 \dotsm 1}_{\text{m 个}})_kn=(m 个11⋯1)k。根据数据范围,m 最大可以取到 log2nlog_2nlog2n。给定 m 和 n 后,可以快速计算出 k=⌊nm⌋k = \lfloor \sqrt[m]{n} \rfloork=⌊mn⌋,然后带入检验,看计算的结果是不是 n,如果是,就返回结果。
1234567891011121314151617181920212223class Solution { public: string smallestGoodBase(string n) { long nVal = stol(n); int mMax = floor(log(nVal) / log(2)); // 枚举所有可能的 m,有 m 个 1 for (int m = mMax; m > 1; m--) { // 计算一下,如果数量为 n,用 k ...