
S3: 趣味思路
涛歌依旧
毕业后就职于华为和腾讯
展开
-
读《半小时漫画计算机》
最近朋友送了一本书给我,就是下面这本原创 2021-11-15 22:25:06 · 2755 阅读 · 4 评论 -
从rand5到rand7的思路和代码验证(某公司社招笔试题)
我们先来看这样一个问题, 已知rand5能等概率产生1, 2, 3, 4, 5, 现要用rand5来实现rand7(rand7的意思是要等概率产生1, 2, 3, 4, 5,6, 7), 该怎么搞呢? 我看了一下网上资料, 很多都是凑出来一个结果, 没有什么过程思路, 我觉得虽然结果正确, 但总感觉所用的技巧性太强。 所以, 在文本中, 我也来凑凑热闹, 看看该如何下手, 并给出程序的实际验证结原创 2015-06-28 16:42:50 · 10824 阅读 · 3 评论 -
bit-map再显身手:test.txt中有42亿个无符号整数, 求文件中有多少不重复的数(重复的数算一个)。限制: 可用内存为600MB.
来看看这样一个问题:test.txt中有42亿个无符号整数, 求文件中有多少不重复的数(重复的数算一个)。限制: 可用内存为600MB. 思路很简单, 还是用bitmap, 无需多啰嗦, 大家可以直接参考我之前的与bit-map有关的博文: http://blog.youkuaiyun.com/stpeace/article/details/46477239原创 2015-06-24 23:13:15 · 8296 阅读 · 1 评论 -
斗地主之洗牌(shuffle)程序的测试程序
在博文http://coolshell.cn/articles/8593.html中, 皓哥已经详细讨论了各种shuffle程序, 并给出了测试的结果, 但博文中没有提供测试代码。 其实, 测试代码也很简单, 在本文中, 我来写一下测试代码。 在之前的博文http://blog.youkuaiyun.com/stpeace/article/details/46583277中, 我已经原创 2015-06-24 22:16:50 · 8472 阅读 · 2 评论 -
bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
先看看这个题目:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数. 限制: 可用内存为600MB. 又是大数据。 看到42亿, 有灵感没? 要知道, 2的32次方就是42亿多一点点啊。42亿个无符号整数存在于文件中, 我们可以考虑在内存中用bit-map与之建立二值状态映射。 2的32次方个无符号整数, 需要内存空间为512M, 这个是很容易计算的。原创 2015-06-22 20:34:54 · 8216 阅读 · 1 评论 -
bit-map牛刀小试:数组test[X]的值全部在区间[1, 8000]中, 现要输出test中重复的数。要求:1. 不能改变原数组; 2.时间复杂度为O(X);3.除test外空间不超过1KB
先来看看这个题目:数组test[X]的值全部在区间[1, 8000]中, 现要输出test中重复的数。要求:1. 不能改变原数组; 2.时间复杂度为O(X);3.除test外空间不超过1KB. 好, 我们先给出一个不限空间的解法(为了程序方便, 假设X为10, 实际上可能很大):#include using namespace std;#define X 10#原创 2015-06-22 18:45:30 · 8122 阅读 · 6 评论 -
并查集的“并优化”(leader合并)和“查优化”(路径压缩)
在博文http://blog.youkuaiyun.com/stpeace/article/details/46506861中, 我们已经详细地了解了并查集, 不过, 那个程序略显粗糙, 下面我们考虑来优化一下。 先给出没有优化的代码吧:// taoge的并查集#include using namespace std;#define N 1000int leader[N原创 2015-06-22 16:45:53 · 9551 阅读 · 0 评论 -
并查集的简介及其C/C++代码的实现(某公司招聘笔试试题)
当年, 我在一个公司实习, 某次, 在一次算法交流的过程中, 我第一次听到了并查集这个看似高大上的概念, 也再一次感觉到了自己的无知。 对于一个非计算机专业的人来说, 你跟他说并查集, 就有点像你对着计算机专业的人说Gibbs现象或者FFT一样, 你懂的。 后来, 某公司的招聘笔试题目中, 又出现并查集, 让我们一起来看看这个题目吧: 假如已知有 n 个人原创 2015-06-15 20:10:24 · 15711 阅读 · 4 评论 -
求数组a[N]中第i(1<=i<=n)小的数(2012年某公司实习生招聘面试试题)
当年, 某公司实习生招聘, 在第一轮面试中, 我遇到这样一个题目: 有10000个互不相同的无序整数, 如何找到数组的median值(也就是说: 有一半数比它小, 另一半数比它大)。 当时, 我傻不愣登地说: 用O(N*lgN)的排序啊, 比如: 快速排序,堆排序, 归并排序, 希尔排序。 然后面试官提示我:只需要找出median, 而你排序却做了大量的无用功, 还有没有原创 2015-06-13 16:21:25 · 7948 阅读 · 4 评论 -
pointer指向链表的某结点(非尾结点), 且不知道该结点的前驱结点(也不知道更前驱的结点), 请给出删除该结点的方法
pointer指向链表的某结点(非尾结点), 且不知道该结点的前驱结点(也不知道更前驱的结点), 现在我们要删除该结点, 怎么做呢? 思维死板的人肯定说, 没有办法啊, 其实, 办法是有的, 只不过是间接的。 下面, 我们给出一个极其简单的程序:#includeusing namespace std;typedef struct node{ int data; st原创 2015-06-09 23:38:21 · 8600 阅读 · 8 评论 -
某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧:#include using namespace std;// 时间复杂度为o(n^2), 空间复杂度为o(1), 不符合要求void findSoleNumbers(int原创 2015-06-09 21:40:51 · 8314 阅读 · 6 评论 -
利用map将“简写信件”转化为“原始信件”
我们首先来看这样一个场景: 某人很懒, 写信的时候, 经常用简写的形式代替完整的形式, 比如:9494--->Yes, it is!asap--->as soon as possiblesb--->se bi.... 现在, 要写一套程序, 将这些简单的直接还原为原始的完整形式。 其实, 思路是很自然的, 对简写信中的每一个单词进行判断, 如果需要转化,原创 2015-04-11 21:18:13 · 7741 阅读 · 0 评论 -
计算1-n的和(不用for, while, goto, if, else, switch, case和三目运算符, 也不用乘除法)---利用间接递归
前面, 我们考虑了构造函数, 在本文中, 我们考虑递归来实现。 但是, 通常的递归需要if来做出口啊, 所以我们可以考虑前面博文介绍过的间接递归,实现1-n求和的代码如下:#include using namespace std;typedef int (*pFun)(int n);int f0(int n){ return 0;}int f1(int n){ pFun原创 2015-01-02 23:08:19 · 8730 阅读 · 0 评论 -
2路bit-map的应用:test.txt中有42亿个无符号整数,从小到大打印其中只出现过一次的数 。限制: 可用内存为1.5GB.
先看这样一个问题:test.txt中有42亿个无符号整数,从小到大打印其中只出现过一次的数 。限制: 可用内存为1.5GB. 前面, 我们已经深入讨论了bit-map, 在本文中, 我们来看看2路bit-map, 其实, 它无非是对bit-map的扩展, 用了两个数组而已罢了。 既然已经熟悉了bit-map, 那我就不多啰嗦了, 直接给出代码:#include #inc原创 2015-06-28 18:17:11 · 8167 阅读 · 2 评论 -
fibonacci递归算法的“备忘录/Memo”优化法
我们先看一个简单的fibonacci递归程序:#include #include using namespace std;int fun(int n){ if(1 == n || 2 == n) { return n; } return fun(n - 1) + fun(n - 2);}int main(){ int i = 0; int n = 1000; // 计算100原创 2015-06-28 21:17:40 · 10263 阅读 · 1 评论 -
520最悲情的告白是这样的
男对女说:#include <stdio.h>int main(){ while(1) { printf("I love you!\n"); } return 0;} 女对男说:#include <stdio.h>int main(){ while(1); { ...原创 2018-05-20 16:03:02 · 6010 阅读 · 17 评论 -
满大街都是这种烂题目------从100亿个整数中找出最大的1000个整数
不得不说, 这年头, 满大街都是类似这种烂题目------从100亿个整数中找出最大的1000个整数。 注意点: 内存装不下, 不能一次读到内存。 思路: 随便抽出1000个数, 假设他们是最大的1000个, 然后把剩余的数往其中加, 接着在这1001个数据中淘汰最小的, 再次剩余1000个。 如此循环, 直到最后, 肯定剩下1000个, 也就是最大的1000个。原创 2017-09-02 11:02:35 · 9188 阅读 · 8 评论 -
RSA算法的简要实现(其实原理非常简单)
前面的博文(转载阮一峰)已经讲了RSA算法的基本原理。很久以前的博文曾涉及过模幂算法,今天终于可以登台亮相了,先回顾一下模幂算法的程序吧:#includeusing namespace std;// 返回值: a的b次方,然后对n求模int getMod(int a, int b, int n){ int i, r = 1; for(i = 1; i <= b; i原创 2013-10-27 17:28:21 · 11240 阅读 · 3 评论 -
RSA算法完全解析(地球上最重要的算法之一)
转自:阮一峰的网络日志(一、二) 强力推荐http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.htmlhttp://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 我来总结一下:甲方要向乙方发送信息时,RSA加密如下:转载 2013-10-26 00:06:10 · 8138 阅读 · 2 评论 -
一个简单且安全的文件加密算法------异或加密
有空了,再写!原创 2012-12-18 18:59:03 · 22553 阅读 · 3 评论 -
一个最简单的加密解密算法(人人能懂)------异或加密
#include // KEY 非常重要,不能对公众泄露KEY值// 发送端和接收端提前秘密约定好KEY值#define KEY 1313113 // 万岁万岁万万岁using namespace std;// 加密算法可以公开int encrypt(int plainText, int key){ return plainText ^ key;}原创 2012-12-14 13:53:22 · 52382 阅读 · 21 评论 -
斗地主之洗牌(shuffle)程序(某公司招聘笔试、面试试题)
一副poker通常有54张, 为了简便起见, 假设现有一副10张的poker牌, 试给出洗牌的C/C++代码。 嗯, 本质就是要生成10个随机数(1到10), 而且不能重复。 其实, 我们完全可以先保证不重复, 然后随机, 于是可以这么考虑:给定数列1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 然后尽可能均匀地打乱这个数列, 最简单的方法莫过于:#in原创 2015-06-21 18:55:32 · 8577 阅读 · 2 评论 -
今天学习时突然联想到这样一个有趣但无用的问题:利用C语言(不能是其他语言)求两个整数的较大/小值-----要求不用if、三目?、switch、循环、数组、加减乘除求余、位运算符以及任何库函数
今天学习时突然联想到这样一个有趣但无用的问题:利用C语言(不能是其他语言)求两个整数的较大/小值-----要求不用if、三目?、switch、循环、数组、加减乘除求余、位运算符以及任何库函数。哈哈, 也够无聊的, 略作消遣。这个题目的要求肯定比网上类似题目的要求更苛刻。原创 2015-05-10 12:11:59 · 8601 阅读 · 4 评论 -
百万分之一颗粒度灰度策略
某帐号体系的范围是unsigned int, 请设计一个百万分之一颗粒度的灰度策略。 其实, 没什么难的, 关键是思路。 如果是十分之一颗粒度, 那很简单, 取尾数就行, 先灰度尾号为0的, 然后灰度为1的, 然后... 如果是百分之一颗粒度, 那就取最后两位吧。 同理, 如果是百万分之一, 那就取最后六位吧。原创 2017-01-22 23:09:36 · 7343 阅读 · 0 评论 -
如何让代码在main前main后执行?
被人问起如何让代码在main前main后执行? 这是个有点意思但不难的问题, 熟悉MFC的人肯定知道, 有个全局对象叫theApp, 对了, 你get到了point. 废话少说, 直接上码:#include using namespace std;class OBJ{public: OBJ() { co原创 2015-11-06 23:38:27 · 7924 阅读 · 4 评论 -
两个栈来实现一个队列的C++代码(某公司社会招聘笔试题)
利用两个栈来实现一个队列, 这个问题很常见。 最关键的是要有好的思路, 至于实现, 那是很简单的事情了。 在本文中, 也想说说自己的思路, 但是, 我觉得用代码来表述思路更符合我的习惯, 也是我的菜, 所以, 仅仅给出代码。 如有需要, 大家可以根据代码来理解思路。 OK, 没有必要废话了, 直接上代码:#include <iostream>...原创 2015-07-05 23:35:12 · 9474 阅读 · 11 评论 -
0-1背包问题与动态规划的C/C++代码
那一年, 非计算机专业的我听到0-1背包和动态规划, 觉得很高大上, 其实, 动态规划无非就是寻找高中数学中所说的递推公式而已。最近又复习到0-1背包问题和动态规划, 所以打算用代码来玩玩。 0-1背包问题: 一个小偷来出来活动了, 拿了一个背包, 最多可以装50斤的东西的小袋子。 他眼睛一亮, 发现了三件宝贝a, b, c. 其中a重10斤, 价值60元; b重20斤原创 2015-06-30 23:53:26 · 33362 阅读 · 11 评论 -
从公司回来忘带手机没有闹铃明早起来不了该怎么办?--- 花5分钟用ShellExecute写个闹铃即可!
从公司回来, 忘记带手机, 又没有闹铃, 明天起来不了, 咋办? 回公司去取手机? 不想去。 在楼下买个闹钟? 觉得没必要。 好吧, 写个简单的C语言程序, 在睡觉的时候把它跑起来即可, 我刚验证了一下, 没啥问题#include int main(){ int i = 0; for(i = 0; i < 60 * 7; i++) // 7小时, 睡7个小时足够啦! { Sle原创 2014-12-03 22:14:32 · 8306 阅读 · 2 评论 -
哈哈,这是我见过的最有趣也最无聊的程序
首先说明, 程序不是我写的,但该程序确实非常有趣,也非常无聊:#include <stdio.h>char c[] = {0x7d,0x3b,0xa,0x69,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66...原创 2014-04-13 00:03:59 · 9125 阅读 · 0 评论 -
“三门问题”概率的C++程序解释
设有a, b, c三个门,假设其中有且仅有一个里面有美女,其余两个为空。现在,你任选一个门,不妨设你选了a,选了之后还没来得及打开,此时,主持人帮你打开另外两扇门中的其中一扇,发现里面是空的,不妨说这扇门为b, 请问,此时此刻,为了抱得美人归,你是否愿意放弃a而选择c? 先公布答案吧,不更换,抱得美人归的概率为1/3, 更换之后,抱得美人归的概率为2/3. 不要吃惊,不要惊讶,自己好好原创 2013-04-12 12:57:46 · 11999 阅读 · 1 评论 -
如何简单地判断某时间是否在某区间内?
有意思,看下面程序:#include using namespace std;bool isSpecialTime(int hour, int minute){ /* [8:20 <= x:yz < 10:40) 8.20 <= x.yz < 10.40 820 <= 100x + 10y + z < 1040 820 <= 100 * hour + minute原创 2013-03-17 21:26:24 · 17165 阅读 · 0 评论 -
如何用程序判定点是否在线段上?
之前说过点在直线上的判断, 用面积法。 那么如何判定点C是否在线段AB上呢? 1. 判断C是否在直线AB上 2. 判断Xc和Xa, Xb的大小关系 3. 判断Yc和Ya, Yb的大小关系原创 2016-11-20 10:36:35 · 10552 阅读 · 1 评论 -
如何用程序判定三点是否共线?
如何用程序判定三点是否共线? 别扯什么线性规划、直线方程, 不好操作啊, 还要分类讨论。 其实很简单, 只需要判定这三点组成的“三角形”面积是否为零! 有兴趣的朋友可以写程序代码来玩玩, 我之前写过了。 PS. 已知三点, 求面积很简单, 直接海伦公式搞起。原创 2016-11-19 16:24:00 · 14922 阅读 · 0 评论 -
bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G
之前聊过很多与bitmap有关的东东, 今天我们来看这样一个问题:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G. 很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:#include #include using namespace std;#define BIT_INT 32原创 2015-08-04 23:33:16 · 8842 阅读 · 8 评论 -
一个公司是要有多无聊和搞笑才会出这种笔试题目为难程序员呢? 哈哈, 大家乐呵一下
某些公司, 偶尔会故意出一些刁钻的没有任何意义的笔试题目来为难大家, 我们就不要生气了, 也来搞笑一下吧, 笑一笑, 十年少。 程序如下:#include int main( ){http://www.baidu.comprintf("http://www.baidu.com\n");return 0;}A. 编译错误原创 2015-05-11 22:26:32 · 12074 阅读 · 7 评论 -
经典的单词计数程序---利用关联数组map和互斥集合set
在前面的文章中, 我们详细讲述了map这个关联数组, 并介绍了经典的单词计数程序, 下面, 我们看看这个场景: 单词计数的时候, 不考虑一系列的单词, 如不考虑"a", "kj"等等。 我们知道, set是个互斥集合, 所以在此可以排上用场了, 且看:#pragma warning(disable : 4786)#include #include #include #include原创 2015-04-10 23:57:09 · 7974 阅读 · 1 评论 -
计算1-n的和(不用for, while, goto, if, else, switch, case和三目运算符, 也不用乘除法)---利用多态性
之前, 我们利用间接递归来实现了1-n的求和, 我们自己动态地选择了调用哪个函数。 仔细想一下, C++中的多态不就是专门干这个事情的么? 试一下:#include using namespace std;class A{public: virtual int getResult(int n) { return 0; }};A *p[2] = {NULL, NULL}原创 2015-01-02 23:24:35 · 7987 阅读 · 1 评论 -
递归一定要用if, else, switch, case或三目运算符吗?---非也!
递归一定要用if, else, switch, case或三目运算符吗? 非也, 我们来看一个间接递归的程序:#include using namespace std;typedef int (*pFun)(int n);int f0(int n){ return 0;}int f1(int n){ pFun fun[2] = {f0, f1}; return fun原创 2015-01-02 23:02:36 · 9108 阅读 · 0 评论 -
计算1-n的和(不用for, while, goto, if, else, switch, case和三目运算符, 也不用乘除法)---利用构造函数
既然不能循环, 那么就让编译器自动触发(调用)某函数吧, 在C++中, 什么函数能被自动默认调用呢? 对, 我们考虑用构造函数来巧妙实现:#include using namespace std;class A{ static int n; static int sum; public: A() { n++; sum += n; } static getRes原创 2015-01-02 22:25:42 · 7630 阅读 · 0 评论 -
计算1-n的和(不用for, while, goto, if, else, switch, case和三目运算符, 也不用乘除法)---利用pow函数
利用pow函数来投机取巧一下, 但面试官肯定不期望如此:#include #include using namespace std;int sum(int n){ int result = pow(n, 2) + n; return result >> 1;}int main(){ int n = 100; cout << sum(n) << endl; retu原创 2015-01-02 22:16:24 · 7597 阅读 · 0 评论