随笔分类 -  Algorithm

摘要:做小米的笔试题,给出一个整数n,求出它在杨辉三角形中第一次出现的行号。 想了半天,只能暴力法,从第1行开始找,一直找到第n行,若找得到则返回行号,若找不到则返回n+1(因为第n+1行第2列肯定是n)。当然,注意1是在第1行而不是第2行。更好的方法倒是没想到,倒是折腾出了打印杨辉三角形前n行的最优方法 阅读全文
posted @ 2017-09-19 02:28 Harley_Quinn 阅读(601) 评论(0) 推荐(0)
摘要:两个bit的异或(下文均用^代表异或运算):1^0=1 0^1=1 1^1=0 0^0=0,也就是左右元素不同时为1,相同时为0。 对于两个int的异或,就是对它的二进制表示的每一位进行异或运算,比如2^5=binary(010^101)=binary(111)=7 并且异或运算满足交换律、结合律, 阅读全文
posted @ 2017-09-13 00:55 Harley_Quinn 阅读(630) 评论(0) 推荐(0)
摘要:还是头条的笔试题(咦?),问题最后转换成这样的形式: 输入:不包含重复元素的有序数组a[N]以及上下界low, high; 输出:数组a[N]中满足元素处于闭区间[low,high]内(即low <= a[i] <= high)的元素个数 二分查找一向的特点,原理上非常好理解,但是判断边界的时候则是 阅读全文
posted @ 2017-09-10 21:26 Harley_Quinn 阅读(391) 评论(0) 推荐(0)
摘要:PS:这篇是之前本来就想发的但是一直没时间写,加上今天做了京东的题,结果代码名就命名为jingdong了……懒得改代码名重新跑一遍结果了=。= 暴力法去做就是遍历每个点,判断它是不是“最大点”。判断过程则是又遍历一遍,看看是否存在其他点在它右上方,若存在则不是最大点。O(N^2) 但是这样就会有很多 阅读全文
posted @ 2017-09-10 01:36 Harley_Quinn 阅读(990) 评论(0) 推荐(0)
摘要:回溯法是个很无聊的死算方法,没什么技巧,写这篇博客主要原因是以前思路不太清晰,现在突然想用回溯法解决一个问题时,无法快速把思路转换成代码。 N-皇后问题描述:在N*N的棋盘上,每一行放置一个皇后,使得任意皇后之间不能互相攻击。求放置方法。 (因为国际象棋中皇后可以走横竖斜线,所以相当于是任意2个棋子 阅读全文
posted @ 2017-07-26 16:08 Harley_Quinn 阅读(9375) 评论(0) 推荐(1)
摘要:实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入、遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了 阅读全文
posted @ 2017-07-25 01:47 Harley_Quinn 阅读(2283) 评论(0) 推荐(0)
摘要:首先说下STL优先队列的局限性,那就是只提供入队、出队、取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离)。 看似可以用vector配合make_heap/push_heap/pop_heap来实现这个功能,实际上手动实现就会发现问题所在 阅读全文
posted @ 2017-04-02 05:59 Harley_Quinn 阅读(1617) 评论(2) 推荐(0)
摘要:二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值<=当前节点则到左子树,否则到右子树。查找时间复杂度是O(logN),因为树的高度是logN。 二分查找分两种:一 阅读全文
posted @ 2017-01-20 00:56 Harley_Quinn 阅读(2711) 评论(0) 推荐(0)
摘要:问题描述:给出一个升序排列好的整数数组,找出2个数,它们的和等于目标数。返回这两个数的下标(从1开始),其中第1个下标比第2个下标小。 Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2 分析:在排序好的数组中进行查找, 阅读全文
posted @ 2016-09-03 05:22 Harley_Quinn 阅读(420) 评论(0) 推荐(0)
摘要:问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了2次,找出只出现1次的元素。 int singleNumber(vector<int>& nums); 分析:比较自然的想法是用一个容器来进行插入、查找、删除操作。遍历nums,先查找容器中是否包含该元素,是则插入,否则删除。最后容器中 阅读全文
posted @ 2016-08-25 01:18 Harley_Quinn 阅读(154) 评论(0) 推荐(0)
摘要:问题描述:不使用+是或-操作符进行整数的加法运算 int getSum(int a, int b); 我的思路:把整数化成二进制进行运算,注意类型是int,也就是要考虑负数。关于负数的二进制表示可见之前的一篇博文 C语言的补码表示和unsigned及signed的转换 对于负数,我采用转换成正数(u 阅读全文
posted @ 2016-08-23 21:43 Harley_Quinn 阅读(262) 评论(0) 推荐(0)
摘要:问题描述:给出一个非负整数num,对[0, num]范围内每个数都计算它的二进制表示中1的个数 Example:For num = 5 you should return [0,1,1,2,1,2] 思路:该题属于找规律题,令i从0开始,设f(i)为i对应二进制表示中1的个数,写几对对应值就出来了。 阅读全文
posted @ 2016-08-23 00:14 Harley_Quinn 阅读(333) 评论(0) 推荐(0)
摘要:感觉基本功还是不扎实,虽然能做些程序但是现在看来我还是个初学者(primer),试着完成习题结果还得修修改改。 废话不多说,实现功能很简单,《C++ Primer》9.5.2节习题。 对字符串进行替换,实际上是先找到字符串s中的匹配部分,将匹配部分(oldVal)删除,然后插入要替换的字符串(new 阅读全文
posted @ 2016-04-18 21:01 Harley_Quinn 阅读(626) 评论(0) 推荐(0)
摘要:以前很少做删除操作,vector一直当成数组用,而实际追求效率时又经常舍弃vector选用C风格数组。看《C++ Primer》到顺序容器删除这节时试着实现课后习题结果一动手我就出错了。 习题是将数组int ia[]拷贝到std::vector<int>中,并删除偶数元素。 先给出我的错误代码 抛出 阅读全文
posted @ 2016-04-18 00:44 Harley_Quinn 阅读(2023) 评论(0) 推荐(0)