随笔分类 -  算法设计与分析

 
快速寻找满足条件的两个数
摘要:《编程之美》里的一个题目:能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,假设这个数组中肯定存在至少一组符合要求的解。 LeetCode的题目: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum ... 阅读全文
posted @ 2014-08-21 13:16 做个不善的人 阅读(799) 评论(0) 推荐(0) 编辑
leetcode Online Judge 150题 解答分析之一 Reverse Words in a String
摘要:问题Given an input string, reverse the string word by word.For example, Given s = "the sky is blue", return "blue is sky the".面试时我应该至少问的问题What constitut... 阅读全文
posted @ 2014-08-20 13:30 做个不善的人 阅读(1149) 评论(0) 推荐(0) 编辑
coding题都在考察我们的什么技能
摘要:其实不是都在考我们的算法设计,有的时候算法简单,但是coding却可能不那么简单,比如下面这道题目:题:写一个把字符串的IP地址变成32位整数的函数,要求考察程序健壮性。这题初看起来一点都不难,但是真写起来,要没错误还是有点难度的。 阅读全文
posted @ 2014-08-13 13:26 做个不善的人 阅读(509) 评论(0) 推荐(0) 编辑
子序列问题集锦
摘要:题目1:序列123...N,N介于3和9之间,在其中加入+、-或者空格,使其和为0。如123456 1-2 3-4 5+6 7 等价于1-23-45+67=0。请问,如何获得所有组合? 题目2:求数组的子数组之和最大值:一个有N个整数元素的一维数组,求其子数组之和的最大值。求和最大的子数组。 扩展题目2:在一个二维数组中,求其子数组之和的最大值。 题目3:最长公共子序列:两个字符串,求这两个字符... 阅读全文
posted @ 2014-08-13 13:21 做个不善的人 阅读(558) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(4) -- 动态规划之一(理论篇)
摘要:跟分治法类似的是,动态规划也是通过组合子问题的解而解决整个问题的,不同的是,分治把问题划分为一些独立的子问题,但动态规划适用的是子问题不独立的情况,也就是子问题包含公共的子子问题。 动态规划通常应用于最优化问题,这些问题往往有很多个解,即使是最优解也可能有多个,所以动态规划的某种应用只是找出了一个最 阅读全文
posted @ 2014-08-07 12:59 做个不善的人 阅读(481) 评论(0) 推荐(0) 编辑
面试题集合
摘要:A binary gap within a positive integer N is any maximal sequence of consecutive zeros that issurrounded by ones at both ends in the binary representat... 阅读全文
posted @ 2014-08-04 13:19 做个不善的人 阅读(551) 评论(0) 推荐(0) 编辑
计算机算法学习(1) - 不相交集合数据结构
摘要:不相交集合 故名思意就是一种含有多个不相交集合的数据结构。典型的应用是确定无向图中连通子图的个数。其基本操作包括:Make-Set(x):建立一个新的集合,集合的成员是x;Union(x,y): 将包含x和y的集合合并为一个集合;Find-Set(x): 返回指向包含x的集合的指针;下面是一个例子,... 阅读全文
posted @ 2014-08-04 05:33 做个不善的人 阅读(985) 评论(0) 推荐(0) 编辑
[Inside] What’s the assumptions you are making
摘要:在我们写代码的时候,其实无时不在做assumption,这些assumption会引导我们使用不同的算法,不同的实现,如果我们能够意识到这些assumption,并能validate这些assumption,就可以得到一个好的assumption,好的assumption就可以引导我们设计出更好的算法,更好性能的实现。所以在设计一个算法、实现一份代码之前,一定要把问题搞清楚了,也就是clarify assumption,哪怕那些觉得理所当然的assumption也要拿出来validate/verify一下。作为练习的一部分,把前面的几个题目翻出来,看看我们在开始设计算法和写代码之前,都可以cl 阅读全文
posted @ 2012-12-25 10:02 做个不善的人 阅读(440) 评论(0) 推荐(0) 编辑
算法面试题解答(八)
摘要:这一节我们来看看in-place类的问题。 什么叫in-place类问题呢?就是原地操作,也就等价于没有额外内存分配。举例来说:1. 有个句子,例如”This is a good book”,将单词顺序反转,变为如下的一个句子:“book good a is This”,要求in-place完成;2... 阅读全文
posted @ 2012-12-19 19:23 做个不善的人 阅读(538) 评论(0) 推荐(0) 编辑
算法面试题解答(七)
摘要:这篇讲关于链表的故事,先来一个经典的题目吧:链表反转:LinkedListNode * revertLinkedlist(LinkedListNode *list){ if(list == NULL || list->next == NULL) return list; LinkedListNode *prev,*cur, *t; prev = NULL; cur = list; while(cur!=NULL) { t = cur->next; cur->next = prev; pr... 阅读全文
posted @ 2012-12-18 18:22 做个不善的人 阅读(343) 评论(0) 推荐(0) 编辑
算法面试题解答(六)
摘要:我想把这期作为数组类面试题的一个总结,题目不难,但是要注意不要犯错,下面是容易犯错的地方: 1. ++,--后索引有可能不满足我们假设的条件,一般情况都需要判断,使用while,for,if进行条件检查; 2. ++,-- 和break或者continue配合时,可别搞乱了顺序 题目1: Given an array with positive, negative and zeros, arra... 阅读全文
posted @ 2012-12-18 17:37 做个不善的人 阅读(341) 评论(0) 推荐(0) 编辑
算法面试题解答(五)
摘要:今天再总结几道题吧。记得在算法面试题解答(二)中,我做了一个题目:Two sorted array. Find kth smallest element: O(logK),我用的是类似于二叉搜索的方式做的,而最容易想到的方法是从两个数组的头开始比较,一旦找到第k大的数字就停止,而这种方式真要实现起来也不是那么轻松,麻烦就在于有很多边界条件需要处理。下面我们来写写试试吧:int FindKthElement(const int *src1,int len1, const int *src2,int len2, int k, int *result){ if((len1+len2)<k || 阅读全文
posted @ 2012-12-10 16:03 做个不善的人 阅读(383) 评论(0) 推荐(0) 编辑
算法面试题解答(四)
摘要:1. 求两个字符串的最大公共字符串#include<iostream>usingnamespacestd;voidgetLength(constchar*src1,constchar*src2,int*l1,int*l2){if(src1==NULL||src2==NULL||strlen(src1)==0||strlen(src2)==0){*l1=0;*l2=0;return;}intpl1=0,pl2=0;inttpl1=0,tpl2=0;inttpl3=0,tpl4=0;if(src1[0]==src2[0]){getLength(src1+1,src2+1,&tp 阅读全文
posted @ 2012-11-26 15:35 做个不善的人 阅读(318) 评论(0) 推荐(0) 编辑
算法面试题解答(三)
摘要:1. 按螺旋方式打印矩阵: Print in spiral form as shown belowFor n=23 20 1For n=34 3 25 0 16 7 8For n=415 14 13 124 3 2 115 0 1 106 7 8 9 一看到这个题目应该比较容易想到递归,不过这个递归里面有些细节需要特别注意,代码如下: #include <iostream>#include <math.h>usingnamespace std;struct Position{ Position(int _x, int _y) { x = _x; y = _y;} int 阅读全文
posted @ 2012-11-25 13:07 做个不善的人 阅读(281) 评论(0) 推荐(0) 编辑
算法面试题解答(二)
摘要:在面试中,我们经常被问到Coding的问题,要求用伪码或者某种语言解决一个问题,由于平时我们都依赖IDE来debug找错,所以很容易写出有错误的程序,而且没有调试,导致有些错误极难被发现,下面列举一些常见错误,并以三个题目的实践作为例子告诉自己:错误很容易发生!!!请注意验证自己的程序。边界条件:循环变量的起始点、结束点和增减是否正确;递归调用的结束条件;对于输入,是否考虑可能很大或者很小的情况,比如,对某个序列进行rotate,这个次数如果是特别大,至少打过序列长度,这种情况考虑了吗;空间边界,内存、字符串、数组的大小对吗,是否存在差1和越界情况数据结构边界,链表的头和尾正确处理了吗,指针指 阅读全文
posted @ 2012-11-18 11:47 做个不善的人 阅读(453) 评论(0) 推荐(0) 编辑
算法面试题解答(一)
摘要:1. 在一个数组中找出出现次数超过n/2的元素 第一次看到这个题目是在《编程之美》上,书上给的算法是,每次从数组中删除两个不一样的元素,那最后剩下的就是出现次数超过n/2的元素,但是这种很直观的办法要么就是破坏原来的数组,要么将原数组复制一份,这样都不好,有没有空间需求是O(0),而且不破坏原数组的方法呢? 下面就是这样的一种方法,用一个计数器统计出现次数,如果发现一个跟现在保存的值不一样的,就将其减一,如果计数变成0,那么就需要更新这个值,其思想跟之前的类似,但是它的空间需求是O(0)的。下面是代码: staticvoid Main(string[] args) { int[] list . 阅读全文
posted @ 2012-11-13 14:15 做个不善的人 阅读(595) 评论(0) 推荐(0) 编辑
经典计算机基础数据结构:图
摘要:1. 图的表示大家都知道图有两种标准的表示方法:邻接表或者邻接矩阵。可是它们分别有什么样的好处呢?答案是:邻接表适合稀疏图,而邻接矩阵时候稠密图;要确定图中边(u,v)是否存在,只能在定点u的邻接表中搜索v,效率不高,而这时邻接矩阵就要方便的多了;理论上知道了邻接表和邻接矩阵,如何用代码来实现呢?#include <stdlib.h>#include <queue>using namespace std;#define MAX_VERTEX_NUM 20typedef enum _VisitedColor{ Black, White, Grey}VisitedColor 阅读全文
posted @ 2012-11-11 11:03 做个不善的人 阅读(2121) 评论(0) 推荐(0) 编辑
求数组的子数组之和的最大值
摘要:问题描述:一个有N个整数元素的一维数组(A[0],A[1],...A(n-1),它包含很多子数组,求子数组之和的最大值,当数组元素全部为负的时候,有两种处理办法,第一种是返回0,第二种是返回数组中最大的负数。 阅读全文
posted @ 2012-11-05 19:30 做个不善的人 阅读(204) 评论(0) 推荐(0) 编辑
关于计算几何的几个问题之二(凸包和最近点对)
摘要:这两个问题都是向量叉积的应用,在本文中一并介绍。 阅读全文
posted @ 2012-10-22 13:27 做个不善的人 阅读(260) 评论(0) 推荐(0) 编辑
关于计算几何的几个问题之一(线段性质与线段相交)
摘要:首先线段可以用向量来表示,下面简单说一下: 1.矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。2.矢量加减法:设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。 再说说用向量来表示线段 阅读全文
posted @ 2012-10-22 13:25 做个不善的人 阅读(1192) 评论(0) 推荐(0) 编辑