知道做到

本文探讨了从知道一个道理到将其付诸实践的过程及障碍。强调了认知转变的重要性,提出通过精要主义、绿灯思维及持续跟进的方式克服信息过载、消极过滤及缺少跟进这三个主要障碍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《知道做到》读书笔记(2017-05)

知道做到

先说一个简单的问题,为什么我们知道这么多道理还过不好一生?如果缺少独立思考能力且又十分努力的人(注意这个描述,缺少独立思考且十分努力)会感觉“说的太对了,我看了这么多书知道这么多道理可是和那些不看书,没心没肺的相比,没有觉得过的怎么好,也没觉得比他们哪强了。”其实这个问题隐含了一个价值观假设,也就是知道很多道理就应该能够过好一生,其实这个价值观假就是存疑的,难道“知道这么多道理就能够过好一生吗?”

我们都知道早起好,知道健身重要,知道看书好,知道会英语好,知道……知道这些就能够过好一生吗?显然只是知道层面,是完全不够的,而且这个“知道的层次”也显然不够,比如同样是知道写作重要。

知道写作是对自己好,做了总比没做好;
知道写作是对自己好,有很多好处,可能看了某篇文章被触动了;
知道写作是对自己好,写了10万字,有过一定实践尝试了;
知道写作是对自己好,坚持写了2年大约40多万字,有过大量实践;
知道写作是对自己好,写了5本书了;
知道写作是对自己好,想有深远悠久的影响力。

不同人对知道的理解层次是不一样的,也就早就了不同的结果,简单点说,针对某个道理,如果只是到了知道这个层次,完全不够用,也别想着过好一生了,过好现在都困难,只有理解到一定程度,甚至达到思维意识的转变,融入了自己的思维,根本没觉得是道理,才是真的知道。举个例子,就像做产品的理念,要少做功能,往精里面做,不要做的大而复杂,这个道理要学好久,很多经验才能理解,而很多牛逼的产品经理,做产品适合根本不会想这些道理,已经把这些道理融入了自己的意识,他们会觉得做产品不就应该这样吗?类似的情况很多,可能你花了多少年明白一个道理,在某些人眼里这本来不就应该这样吗?可能他们是天才,也可能环境好从小就这么教育的,也可能他们背后付出了很多的努力才达到一定境界,不过那都是别人的,重要的是我们自己怎么从最粗浅的知道达到融入骨髓的思维意识层面的转变呢?

其实原理也很简单,先从知道到做到,然后从不断重复,积累到量变引起质变,就达到意识转变了。最困难的环节在从知道到做到,很多人知道了某个道理之后就直接去做了,坚持一段时间就坚持不下去了,其实是因为忽略了中间有一个步骤,就是“我有正确的方法去执行”。

知道是第一个步骤,知道一个道理或一件事就像爬山时候看到了山顶一样,看到山顶非常有用,明确了目标保证了方向是对的;第二个步骤应该是明确爬山的方法,如何上去,是徒步爬上去,还是坐缆车上去,还是……很多人往往忽视这个环节,从而缺少正确的方法,越坚持越痛苦,最终“行百里者半于九十”;有了第二个步骤,第三个步骤就简单了,just do it!按照正确的方法执行就可以了。

了解了从知道到做到的3个步骤,还有3个重大的阻碍在阻拦者我们。

你是否看过一篇特别牛逼的文章,看完后久久不能忘怀,抑制不住激动的心赶紧收藏了,可能是收藏到印象笔记,也可能是微信收藏,甚至你可能找了很多快速收藏、一键收藏的工具,开始时读完了好的收藏,后来就没时间读了,觉得好的就收藏,再后来是别人觉得好的你就收藏,收藏收藏着就有了几百篇,慢慢的收藏=永不再读,你非但没有因为读了这么多文章而牛逼,反而因为收藏这么多文章没时间看而焦虑。越是焦虑越是收藏,利用一切碎片时间阅读,缺少独立思考,越读越没收获,越是焦虑……这就是典型的知识垃圾桶,知识太多了,没时间把外在知识变成自己的理解,反而没有任何收获。所以,第一个阻碍就是:

信息过载

解决办法就是精要主义,把精力集中在少数关键事情上,对这些事情一次一次的重复,反而能形成竞争优势,这是一个非常重要的认知(注意,是认知)。要有勇气花时间重复我们已经知道的事情,为什么说勇气呢,重复已经会的东西是痛苦的,带来的成就感不强,而学会一个个的新知识带来的成就感很强,短时间内感觉自己提高很快(长时间就是焦虑),所以很多人愿意学习新知识,而不愿意重复已经会的。所以防止信息过载就是要控制自己的知识上瘾,不要太贪心,先把自己专业领域弄到精通就够你花费很久很久的时间了,很多人上来就考虑什么互联网、影视、生活、健身、饮食、摄影、旅游、情感关系等等很多方面,结果就是什么都弄不精,什么都不会。

再说说第二个阻碍,先讲一个故事,我们做软件经常会有给客户演示的环节,尤其客户里面有一些大领导在场,比如院长级别的,他们气场很强,权利很大,略有不满可能一个省的合同就没了,所以很多人非常紧张,不同的是,他们面对公司同时时可能都不用准备,直接讲解就能滔滔不绝,这个也比较好理解,心理压力没这么大了嘛。当我一个同事在饭桌上提到这件事,说他的体会的时候,我忽然意识到一个词,就是不卑不亢,能够做到不卑不亢真的是非不容易,不是靠看几本书听别人讲讲就能搞定的,只有长期大量的和高级别人士沟通,练就自己的心态,积累经验才能做到。这个不卑不亢让我和当时我们一起吃饭的4个人非常感叹,觉得做到的人真的很牛逼,我们也有很多值得学习他们的地方。

相反,后来我给很多人讲过这个故事,大部分人都几乎没感觉,不卑不亢谁不知道呀,你做不到是你心态的问题,很多人都觉得自己能做到,甚至觉得做不到的人是中国人的奴性思维的产物。想想这些上来就反对的人,不管故事讲得好不好,不管他的观点对错,结果就是他没有任何收获,也就没有任何改变,也就没有任何进步。这就是第二个阻碍:

消极过滤

也就是干什么事总喜欢消极的一面,别人说了什么总想着问题在哪,习惯性的去质疑别人,而不是主动接受。很多领导天天接触大量的信息就会习惯性产生这种思维,他需要不停的识别哪个是对的,哪个是有用的,需要不停的问问题,质疑别人。不是说这种思维不好(有很多书专门训练人要学会明辨性思维,就是各种质疑),只是这种思维不利于我们从知道到做到。

解决方案就是绿灯思维,见到什么事都先接受,耐心听进去,即使真的完全不认同观念,也要站在对方角度考虑,是不是这个观点适合他的阶段他的层次他的环境,而不是与自己不同就马上反对。绿灯之后有个黄灯,再考虑对错,与自己有什么用,不要走极端,什么都接受或什么都不接受。

最后说说第三个阻碍,一般8小时培训,如果有效的话需要2周时间来跟进,如果没有跟进,72小时后留存5%左右,也就是我们经常参加培训、学习、沙龙、业界大会等,当是热血沸腾,但如果不记笔记,回来不复习,几天后基本就忘光了。人们经常认为采取一个行动重要的是掌握新的知识,所以人们宁愿花很多时间去学习新事物,但是却不愿意花一点点时间去跟进之后对知识的应用,这就是第三个阻碍:

缺少跟进

解决办法就是持续跟进,说起来容易做起来难,很多人不知道如何跟进,方法就是:指导——支持——问责,并重复步骤。如果是培训,外在有人帮你比较简单了,如果自己学有办法指导、支持、问责吗?当然有:

指导:自己学习,找途径提高自己,比如主动找人教自己(不单单是求助,可以花钱请人教自己),主动看书,相当于作者指导了你。

支持:自己鼓励自己,这个看似比较难,其实就是找成就感,找仪式感,比如写作,每天写1篇文章,坚持1年,如果没有汇总就没成就感,如果汇总到一个列表,一看300多篇,30万字,是不是特别有成就感。工作中也一样,有的人普普通通工作了3年,有的人工作内容一样,但是善于总结,经常写一些技术文章,3年写了50篇(量非常小了),一看就很有成就感,这是自己成长的过程,潜意识就会对工作更加有信心。

问责:这个就是反思,给自己设定一个截止时间,比如至少1个月反思一次,如果不设置时间,你也会每年反思一次,因为任何人都有反思的意识,只是没激发而已,自然年结束就是一个无形的标志,会激发人进入总结反思,如果每年你看着别人总结反思,你都没有反思一下,那真无药可救了。

最后总结一下,从知道到做到,需要的三个步骤:

第一步,改变认知,知识层面的转化(精要的学习)
第二步,改变态度,积极思维的转化(训练绿灯思维)
第三步,改变行为,跟进系统(一套具体详实的跟进计划)
每一个步骤都花时间重复,间隔性重复。

恭喜你,看完了一篇3500字的文章,希望看完这篇文章能够引起你启发,给你带来收获。

<think>我们正在讨论C++中的`std::unique`函数,并关注如何用它来统计重复数字的个数。根据用户之前的问题,我们知道`std::unique`用于去除相邻的重复元素,但它本身并不直接返回重复元素的个数。不过,我们可以利用它来辅助统计。 思路: 1. 首先,我们需要对序列排序,因为`std::unique`只能去除相邻的重复元素。 2. 使用`std::unique`将重复的元素移到末尾,并返回一个指向新结尾的迭代器。 3. 然后,我们可以通过计算原序列长度和新序列长度的差值,得到重复元素的总个数(注意:重复元素的总个数是指所有重复出现的元素出现的次数总和,还是指重复元素的种类数?这里需要明确)。 但是,用户的问题可能是想统计每个重复元素的重复次数,或者统计总共有多少个重复出现的元素(即重复出现的次数总和)。另外,也可能是指重复元素出现的次数(即每个元素出现的次数-1)。 我们分两种情况讨论: 情况一:统计每个元素重复出现的次数(即频率) - 我们可以先排序,然后使用`std::unique`结合`std::count`或者直接遍历计数。 情况二:统计重复元素的总个数(即所有重复出现的次数,比如[1,1,2,2,3]中,重复出现的总次数是4(因为1出现2次算重复1次,2出现2次算重复1次,但通常我们统计重复出现的总次数是指超过1次的部分,即每个元素出现次数减1的和)) - 那么总重复次数 = 原长度 - 去重后的长度 例如:数组[1,1,2,2,3]: - 原长度=5,去重后[1,2,3]长度为3,则重复元素总个数=5-3=2(这里指有2个重复的元素?还是重复出现的次数?) 实际上,重复出现的次数总和应该是:每个元素重复的次数之和。对于1重复了1次(出现2次,重复1次),2重复了1次,3没有重复。所以总重复次数=1+1=2,正好等于5-3=2。 因此,我们可以用原长度减去去重后的长度来得到总的重复次数(即每个元素出现次数减1的和)。 但是,如果用户想要的是每个重复元素的重复次数(即频率统计),则需要另一种方法。 下面分别给出两种情况的代码: 情况一:统计每个元素的出现次数(使用排序和遍历) 情况二:统计重复元素的总个数(使用`std::unique`) 由于用户问题中提到了`std::unique`,我们先重点讨论情况二,然后给出情况一的代码。 情况二:统计重复元素的总个数(即重复出现的总次数) 步骤: 1. 排序 2. 调用`std::unique`得到去重后的新结尾 3. 计算重复次数:原长度 - (新结尾 - 开始位置) 代码示例(使用vector): ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 1, 2, 3, 2, 2}; // 1出现2次,2出现4次,3出现1次 // 1. 排序 std::sort(vec.begin(), vec.end()); // 2. 去重,但不删除,得到新结尾 auto last = std::unique(vec.begin(), vec.end()); // 计算去重后的元素个数 int unique_count = std::distance(vec.begin(), last); int total_duplicates = vec.size() - unique_count; std::cout << "Total duplicate elements count (total occurrences of duplicates): " << total_duplicates << std::endl; // 输出:Total duplicate elements count: 4 // 解释:1重复1次(出现2次,减去1次),2重复3次(出现4次,减去1次),所以总重复次数=1+3=4 } ``` 情况一:统计每个元素的出现次数(频率) 我们可以使用`std::map`或者排序后遍历。这里使用排序后遍历: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 1, 2, 3, 2, 2}; std::sort(vec.begin(), vec.end()); // 遍历计数 int current = vec[0]; int count = 1; for (int i = 1; i < vec.size(); i++) { if (vec[i] == current) { count++; } else { std::cout << "Element " << current << " appears " << count << " times." << std::endl; current = vec[i]; count = 1; } } // 输出最后一个元素 std::cout << "Element " << current << " appears " << count << " times." << std::endl; } ``` 但是,如果我们已经使用了`std::unique`,也可以结合`std::unique`和循环来统计。不过,更直接的方法还是遍历。 另外,如果我们只关心重复的元素(出现次数大于1),可以在遍历时只输出重复的: ```cpp // ... 排序后 int current = vec[0]; int count = 1; for (int i = 1; i < vec.size(); i++) { if (vec[i] == current) { count++; } else { if (count > 1) { std::cout << "Element " << current << " appears " << count << " times (duplicated " << (count-1) << " times)." << std::endl; } current = vec[i]; count = 1; } } if (count > 1) { std::cout << "Element " << current << " appears " << count << " times (duplicated " << (count-1) << " times)." << std::endl; } ``` 总结: - 使用`std::unique`可以快速得到重复元素的总个数(重复出现的总次数,即每个元素重复次数的和)。 - 要得到每个元素的重复次数,需要遍历计数。 注意:`std::unique`不会改变容器的容量,只是将重复的元素移到了后面,然后返回新的结尾迭代器。因此,在计算后,如果需要保留去重后的序列,可以配合`erase`使用。 现在,针对用户的问题“C++ unique function how to count number of duplicates”,我们给出了两种解释的代码。 如果用户想要的是每个重复元素的重复次数,那么情况一的代码更合适。如果用户想要的是重复元素的总个数(即重复出现的次数总和),那么情况二的代码更合适。 最后,生成相关问题。</think># C++ `std::unique` 函数统计重复数字个数详解 ## 核心原理 `std::unique` 函数本身不直接提供统计功能,但可以结合其他方法统计重复数字个数: 1. **排序数据**:`std::unique` 只能处理相邻重复元素 2. **标记重复位置**:`std::unique` 返回重复元素起始位置的迭代器 3. **计算差值**:通过迭代器差值计算重复元素个数 ## 统计重复数字的三种方法 ### 方法1:直接计算总重复个数 ```cpp #include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> data = {1, 2, 2, 3, 3, 3, 4}; // 1. 排序 std::sort(data.begin(), data.end()); // 2. 去重并获取新结尾 auto new_end = std::unique(data.begin(), data.end()); // 3. 计算总重复个数 int total_duplicates = data.size() - std::distance(data.begin(), new_end); std::cout << "总重复元素个数: " << total_duplicates << std::endl; // 输出: 总重复元素个数: 3 (2出现2次算1个重复,3出现3次算2个重复) } ``` ### 方法2:统计每个数字的重复次数 ```cpp #include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> data = {1, 2, 2, 3, 3, 3, 4}; std::sort(data.begin(), data.end()); auto it = data.begin(); while (it != data.end()) { auto next = std::upper_bound(it, data.end(), *it); int count = std::distance(it, next); if (count > 1) { std::cout << "数字 " << *it << " 重复了 " << (count - 1) << " 次" << std::endl; } it = next; } } /* 输出: 数字 2 重复了 1 次 数字 3 重复了 2 次 */ ``` ### 方法3:使用 `std::map` 统计频率 ```cpp #include <map> #include <vector> #include <iostream> int main() { std::vector<int> data = {1, 2, 2, 3, 3, 3, 4}; std::map<int, int> frequency; for (int num : data) { frequency[num]++; } for (const auto& pair : frequency) { if (pair.second > 1) { std::cout << "数字 " << pair.first << " 重复了 " << (pair.second - 1) << " 次" << std::endl; } } } /* 输出同上 */ ``` ## 方法对比 | 方法 | 时间复杂度 | 空间复杂度 | 是否修改原数据 | 适用场景 | |------|------------|------------|----------------|----------| | 直接计算 | $O(n \log n)$ | $O(1)$ | 是 | 只需总重复数 | | 二分查找统计 | $O(n \log n)$ | $O(1)$ | 是 | 需每个数字重复次数 | | std::map统计 | $O(n \log n)$ | $O(n)$ | 否 | 需保留原始数据 | ## 关键注意事项 1. **必须排序**:`std::unique` 只处理相邻元素,使用前必须排序[^1] 2. **重复定义**:重复次数 = 出现次数 - 1 3. **性能考虑**:大数据集优先使用方法1或2减少内存占用 4. **自定义类型**:需重载 `operator<` 或提供比较函数 ## 应用场景 1. 数据清洗:统计并移除重复记录 2. 数据分析:计算数据重复率 3. 算法优化:预处理减少计算量 4. 质量控制:检测重复输入错误 > 统计示例:序列 $[a, a, b, b, b, c]$ 中 > - 总重复数 = 6 - 3 = 3 > - $a$ 重复1次,$b$ 重复2次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值