知道做到

知道,就一定要做到!

做到,就一定要有结果!

这是看这本书的理由,刚开始看的时候没有多大的感触,感觉就是一个人在追寻这什么?最终找到了自己想要的答案。那么这本书里讲的是什么问题呢?就是闭合Konw-How与行动之间的鸿沟, 现代信息社会的飞速发展,每天接受的信息也是很多的,五彩缤纷的时间迷乱了双眼,很容易迷失自己,深知的很少,拥有深知的能力也是很少,造成这些的原因分为三类:

1.所拥有的Know-How过多——知识量超负荷

2.消极过重——不恰当的过滤系统

3.坏习惯——不适当的学习方法

一、信息超载

面对信息超载这个问题,我们首先必须确定自己需要学什么,然后才能更有效的学这些东西。人应该少而精的学习,而不是多而浅的接触大量信息。学会“少而精”的学习,对于那些只接触过一次的信息,我们通常只能记住其中一小部分,我们应该少而精的学习而非多而浅的去学习,要想掌握某件事情,我们必须首先选择一些关键点,隔段时间就重复一下,让自己完全沉浸其中,并不断提高自己的知识和技能,关键在于间隔性重复"持久变化之母",一旦真正透彻掌握了自己的工作,人们就会变得更有创造性,甚至能够创造奇迹。

二、消极过滤

当说到这个问题的时候想起了墨菲定律和皮格马利翁效应,这里有详细的说明:皮格马利翁效应+墨菲定律,面对生活的态度真的很重要,今天的你微笑了吗?说到这里,我们来分析为什么很多人不选择积极的思维呢?

第一:一个对你充满信心的人可以改变你的一生

第二:我们完全可以选择自己去聆听什么。(如果我总是在聆听那些否定我的人的话,我可能就会选择接受一个不是那么有挑战性的工作,对自己的期待也会变得非常有限。在爬出"消极之匣"的过程中,我最最需要的,就是一句鼓励的话。)

要想留住一些自己所学到的东西,关键就在于要带着一种开放、积极心态去聆听。

聆听前提:

1、不要带有任何偏见或先入为主

2、带着一种学习的态度,对新的信息感到兴奋

3、带着积极的期待

4、手里拿着纸笔,准备记录

5、带着强烈的欲望,不仅要仔细聆听对方讲话内容,还要努力激发出自己的形象力。

带着一种开放而积极的心态去聆听,去学习。这样会带来一种可能性思维,这样就不仅能100%地吸收自己接触的信息,开放的心态还会让你的知识扩展许多倍。疏清大脑的交通堵塞、开辟道路、点燃创造和应变能力、狂野的梦想,狂野的可能,62%的观念在被人接受之前,都需要一定的条件,那就是呈现!

从拒绝到吸收的一个心历过程是怎样的呢?

第一次接触:拒绝(与我之前的想法冲突)

第二次接触:抵制(明白,但是我还是无法接受)

第三次接触:部分接受(同意,还会有所保留)

第四次接触:完全接受(你知道,这个想法和我的想法完全一样)

第五次接触:部分吸收(立刻应用本想法,太棒了)

第六次接触:完全接受

三、绿灯思维

和以上讲述的积极思维和聆听有很大的联系,我们不管在什么位置学会聆听他人的说法先绿灯在黄灯,这样我们也可以跳出自己的思维创造不一样的奇迹。

四、跟进

指导、支持、问责。给自己积极的心理暗示,跟我说,做给我看,让我尝试,纠正我(表扬我的进步或进行修正),跟我说明。

练习并不能帮你做到完美,只有完美的练习才会让你做到完美!



将你所学到的与大家分享!


<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次
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值