
笔试面试
PYB不开心
这个作者很懒,什么都没留下…
展开
-
单词纠错APP
设计思路:(1)我们首先需要提出一个指标来衡量单词的相似程度,利用编辑距离,即字符串A经过插入,删除,改变三个操作变成字符串B需要花费的最少操作次数,利用动态规划即可解决.(2)如何高效找出候选单词呢,建立字典树然后遍历比较是可以的,但是在单词数量大的时候效率很低。利用BK树可以避免大量的不必要比较,简单来说,A->B+B->C的距离一定大于等于A->C的距离,它满足三角不等式,由此可以推导出两边之原创 2017-04-23 20:40:01 · 1084 阅读 · 0 评论 -
Leetcode. Reverse Nodes in k-Group
这题有两种解法,方法1:方法1:对于任意的k-group,利用O(k)的额外空间存储val,然后从两头开始遍历交换元素->逆转,最后返回一个结点。方法2方法2因为节点对插入操作的复杂度是O(1),我们每遇到一个节点,就将它插入到当前的首节点之后,这样时间复杂度都是O(n),空间复杂度是O(1)。class Solution(object): def reverseKGroup(self, h原创 2016-09-25 22:08:54 · 362 阅读 · 0 评论 -
Leetcode:Next Permutation
此题不难,关键思路是找到某一个最大的i->nums[i],使得存在nums[k],k>i,大于nums[i]。然后将nums[i]的值与nums[k]交换后,并对nums[i+1:]排序。为了找到这个i,我们从右往左遍历,当第一个非递增的元素出现时,i就找到了。但是为了编程方便,我们可以先将nums[i+1:]排序,这样就知道大于nums[i]的最小元素是多少了。class Solution(obj原创 2016-09-27 21:40:47 · 309 阅读 · 0 评论 -
Leetcode:正则表达式.
class Solution(object): def isMatch(self, s, p): print(s,p,'...') i,n = 0,len(p) if s=='':return p=='' or (len(p)>=2 and p[1]=='*' and self.isMatch('',p[2:])) if p==原创 2016-09-25 18:55:30 · 985 阅读 · 0 评论 -
Divide two integer
class Solution(object): def divide(self, dividend, divisor): max_int = 2147483647 divd,divs = abs(dividend),abs(divisor) res = 0 while divd>=divs: a,i =原创 2016-09-25 23:07:43 · 579 阅读 · 0 评论 -
leetcode:22. Generate Parentheses QuestionEditorial Solution
这个题以前在博客里面写过,第一种方法是利用dfs,第二种是采用动态规划的思路。因为lc的测试数据太少,体现不出第二种思路的优越性。class Solution(object): def generateParenthesis(self, n): result = [] def dfs(exp,n1,n2): if n1+n2==2*n:原创 2016-09-25 19:36:57 · 344 阅读 · 0 评论 -
Leetcode:17. Letter Combinations of a Phone Number QuestionEditorial Solution
这题很简单,直接dfs就过了。速度还很快.class Solution(object): def letterCombinations(self, digits): D = {'1':'','2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'} res原创 2016-09-25 19:13:22 · 382 阅读 · 0 评论 -
Leetcode:Longest Palindromic Substring QuestionEditorial Solution
最长回文子串,利用动态规划可以解出来,复杂度是O(n^2),空间复杂度是O(n),因为我们可以用区间长度来进行动态规划,这样总是只需要3n的空间即可。base是size=1和0的情况,然后每次都增加1个长度,用长度为size-2的情况来分析。class Solution(object): def longestPalindrome(self, s): n = len(s)原创 2016-09-25 16:18:17 · 294 阅读 · 0 评论 -
Leetcode:Longest Substring Without Repeating Characters
这题目比较简单,遍历整个s,比较是否重复即可。class Solution(object): def lengthOfLongestSubstring(self, s): sub,t = set(),[] i,n,longest,L = 0,len(s),0,0 offset = 0 while i<n:原创 2016-09-25 13:37:57 · 283 阅读 · 0 评论 -
LeetCode:Median of Two Sorted arrays
给定两个有序的数组,求出这两个数组的中位数。这个题目最简单的解法就是直接合并然后求取,复杂度是O(m+n)的复杂度,但是这样是不能通过测试的。下面给出一个二分的思路来解决问题:分析分析:我们首先求取两个数组中第k大的元素,不妨假设从a中取前pa个元素,b中取前pb个元素。pa+pb=k,假如a[pa]>b[pb],那么我们知道两个数组合并后的序列中a[pa]一定位于b[pb]之后,这也说明b中的前p原创 2016-09-25 13:07:19 · 338 阅读 · 0 评论 -
Leetcode:Substring with Concatenation of All Words
下面提供了两种算法解决这个问题:算法1:算法1:每遇到一个字母就查找它是不是属于首字母集合,若是则开始解析。解析的时候要注意某个单词的数量不能超过此数。一开始利用递归写的的解析函数超时了,改为循环后成功AC。class Solution(object): def findSubstring(self, s, words): def parse(start,d=0):原创 2016-09-26 23:43:04 · 351 阅读 · 0 评论 -
华为面试题:求n对括号的所有合法表达式(两种简洁做法)
这个题目其实以前写过,但是现在再看,有了简洁有效的多的解法:一个DFS就搞定了。同时可以分析一下n对括号的合法表达式有多少种?F(n)=∑n−1k=0F(k)∗F(n−1−k)F(n) = \sum_{k=0}^{n-1}F(k)*F(n-1-k),具体思路很简单,但是闭式表达式我求不出来。def construct(n): def create(num1,num2,exp):原创 2016-08-08 23:16:51 · 1664 阅读 · 0 评论 -
网易笔试的两道dp问题
#include "iostream"#include "vector"#include "algorithm"#include "string"#include "cmath"using namespace std;int main(void){ int n; string k; while (cin >> k) { cin >> n;原创 2017-03-29 18:51:18 · 593 阅读 · 0 评论 -
判定一个点是否在三角形内部
给定任意一个点的坐标和一个三角形,判定这个点是否在三角形内部。本文独立思考完成,没有参考别的资料,可能方法不是太简洁。基本思路:[0]:考虑点在三角形内部的特征:任何一条经过该点的直线都一定会和这个三角形有交点,也就是会与某些边有交点。考虑这样的直线的特殊情况使得经过外部的点的直线和三角形没有交点。容易联想到党该直线平行于某一条边的时候,这样的直线一定会与三角形没有交点(可以将三角形外部的平面划分为原创 2017-01-09 15:37:34 · 1408 阅读 · 0 评论 -
python实现二十四点
给定n个数字,计算出一个满足24点的表达式:比如1,11,2,1:(11+1)*2/1基本思路就是枚举计算顺序(在一开始进行一次全排列),括号,加减乘除。其实有很多是重复计算过了的。这个程序我为了高效找到一个解就算了,但是我们可以找到所有的解(表达顺序可能会重复,比如1+2和2+1),同时也可以计算多个数字的组合。def compute(x,y,op): if op=='+':return原创 2016-11-26 20:29:06 · 13151 阅读 · 3 评论 -
删除子序列问题
给定一个序列,要求从里面删除一个连续的子序列,使得剩下的序列里含有一个最长的连续递增子序列。这个题目有O(nlogn)的解法,但是比较复杂,我也没有研究清楚,就先说O(n^2)的算法吧:最容易想到的是枚举算法(i,j),然后检测能够拼接的最长子序列。当然检测这个步骤需要O(n),我们有两种方式来解决这个问题.(1)预处理计算出所有的f(i),g(i),f(i)代表以第i个元素开始的递增序列,g(i)原创 2016-11-19 19:26:42 · 3123 阅读 · 1 评论 -
滑动窗口问题
给定一个序列,求出一个字序列ALAR没有重复的值。这个题目看似非常简单,但是却很经典,值得反复捉摸。首先,最简单的办法就是用一个大小为k(k从大到小,发现符合条件的就可以停了)的窗口开始扫描,O(n^2)可以解决。左出右进。但是这个效率还是太低了。其实我们可以对比一下leecode上的最大长方形问题,有没有发现有一点相似呢,我们也是不断拓展右边界(只要可以递增),如果不能拓展了,就“滑动窗口”使得最原创 2016-11-18 22:42:58 · 3866 阅读 · 0 评论 -
Leetcode-Sudoku Solver(数独)
这道题的解题思路如下:(1):维护一个list,里面保存所有未确定元素的取值集合(1):维护一个list,里面保存所有未确定元素的取值集合(2):每次从list里面取集合长度最小的集合,然后开始进行dfs(2):每次从list里面取集合长度最小的集合,然后开始进行dfs(3)每确定一个元素,就要更新对应的行,列,block所在的所有元素对应的集合(3)每确定一个元素,就要更新对应的行,列,block原创 2016-10-11 20:42:32 · 445 阅读 · 0 评论 -
数组排列
给定一个整数数组,求该数组的一个排列使得排列之后的数最大:比如[1,3,22,9]=>93221这个问题看似简单,但是要优雅的解决却并不容易.我只找到了dfs的办法进行计算,每次找到首位数最大的一个数字集合,然后枚举其中一个作为当前的位置的元素,然后递归的搜索下去。但是这样的复杂度是很高的。我们来看一下另外一个优雅的解法:定义a>b等价于ab>ba定义a>b等价于ab>ba,然后排序之后的结果即为答原创 2016-11-17 17:32:00 · 2376 阅读 · 0 评论 -
将整数数组进行m等分,使得每一个部分的和相等且m最大
我对这个问题的解法是递归着解决的,首先对原始数组进行排序,然后我们首先选择m的大小,注意这里题目没有说明是否是正整数,如果是:那么最大的m一定小于(数组的和)/(数组最大的元素),否则就要从数组的元素个数开始枚举:假设sum是数组元素和,我们首先判断m是不是可以被sum整除,如果不是,跳过.否则可以开始判断m到底能不能等分。我们对问题进行分解:[1]我们可以首先求出一个数组的子集使得它满足和为sum原创 2016-11-17 17:13:04 · 5633 阅读 · 0 评论 -
HackerRank - Python部分
给定一个字符序列,计算出随机选取k个元素中包含’a’的概率。本题属于简单题,主要思路就是利用公式1−C(N−m,k)/C(N,k)1 - C(N-m,k)/C(N,k)来得到概率。from collections import Counterfrom functools import reduceimport operatordef C(n,k): return reduce(oper原创 2016-10-15 19:48:32 · 2116 阅读 · 0 评论 -
Leetcode:Add two Numbers
首先要安装Hadoop,http://www.jianshu.com/p/3064cc63d507[0]首先注意java的环境变量设置,去官网下载jdk,然后还要在hadoop里面设置java的环境变量.[1]原创 2016-09-24 21:03:09 · 303 阅读 · 0 评论 -
确定任意可重复集合某一排列的字典序
(1)(1)首先考虑某一个不重复集合的排列字典序。这很容易比较,只需找出有多少种排列小于它既可。从第一个元素x开始遍历,不妨假设后面的元素有i个小于x,那么一共有x*(n-1)!种情况。假如没有,则需要保持第一个元素不动,类似的方式判断第二个元素。最后将所有的种类加起来既可(2)(2)假如有重复的元素,那么问题将会变得复杂很多。按照(1)的思路继续,我们假设第一个x后有j个元素小于x,那么我们必须要原创 2016-09-01 12:40:59 · 528 阅读 · 0 评论 -
Leetcode:Largest Rectangle in Histogram
#class Solution(): def largestRectangleArea(self, heights): i,maxs = 0,0 s = [] heights.append(0) while i< len(heights): if len(s)==0 or heights[i]>heigh原创 2016-09-23 11:15:47 · 281 阅读 · 0 评论 -
穷举/动态规划 求解商品最优价格问题
问题大意:商店进行优惠活动,每一件商品的价格达到500以上将对下一件商品减少200,达到1000减少500,达到2000减少1000.也可以将前几件商品看作一个组合(比如299,399,599),那么下一件商品就会减少500元,但是前三个商品不优惠.现在需要购买一系列商品,如何实现最优的购买策略?此题穷举法可解:首先对所有商品进行排序,按照价格从高到低进行排序.然后寻找一个商品区间[0,k1],然后原创 2016-01-25 21:09:36 · 1698 阅读 · 0 评论 -
将一个数m分解为n个不同的数之和(积)
简单递归求解.#include "iostream"#include "vector"#include "algorithm"using namespace std;#define N 4vector<int>record;vector<vector<int>> result;void print(){ for (auto it : record) cout原创 2015-11-26 16:58:36 · 7646 阅读 · 0 评论 -
四阶幻方的穷举求解.
速度太慢了,有时间研究构造四阶幻方的构造法…..#include "iostream"#include "algorithm"#include "queue"#include "vector"#include "list"using namespace std;bool isused[17] = { false };int board[17];queue<int>x;#define原创 2015-11-26 16:35:21 · 2280 阅读 · 0 评论 -
新浪笔试:大数相乘.
这是一道新浪的笔试题,计算两个很大的数相乘并输出结果.思路是采取分解两个大数,将它们写成(a1*10^n1 + a2*10^n2…..)*(b1*10^n1 + b2*10^n2…..)的形式,然后计算a1b1,a2b2…,然后加上权重,最后加起来.算法的时间界是(N1*N2/M^2),N1,N2是输入的位数.#include "iostream"#include "string"#inclu原创 2015-10-19 13:50:22 · 405 阅读 · 0 评论 -
关于不确定长度数组的遍历组合
给定一个集合List = {{“a1,b1,c1”},{“a2”“b2”“c2”}},数量不确定.求字符串组合的集合.比如(“a1a2”,”b1a2”)。。。基本思路:用c++的基本数据结构就可以做出来.写一个函数每次把两个字符串集合遍历组合所得的结果计算出来.然后再写一个函数不停的遍历list里面的集合,并将前面的结果与新的元素再次计算.直到集合遍历完.#include "iostream"#i原创 2015-09-30 20:19:45 · 3117 阅读 · 0 评论 -
华为上机笔试题
摘要:构建一个dos命令行界面的MP3界面,可以输入u,d,l,r四种命令,代表上下左右翻滚,并且当前选择的歌曲由一个[]标记.当输入混合指令如uullr时,按顺序计算最后到达的页面.基本思路:本题没有什么算法可言,主要是注意细节上的问题,比如界面翻到了第几页,剩下多少首歌,什么时候应该从底翻到顶等等.代码比较杂乱不清,是很久以前的东西了,有时间再修改吧、// test_kong.cpp : 定义控原创 2015-09-07 23:04:11 · 617 阅读 · 0 评论 -
动态规划求解抛鸡蛋问题(Google某年面试题)
摘要:假设现在某人手里面有2个鸡蛋,现在有一个200层的高楼,已知从某层楼和以上的楼层抛下鸡蛋,就会使得鸡蛋碎裂.求解用什么样的办法可以使得抛鸡蛋的次数最少.(1)首先从编程的角度求解问题,这个问题是一个典型的动态规划的问题.假设对于N层楼,手里有2个鸡蛋,所需要的最少的抛鸡蛋次数是F(N)。那么我们第一步一定是选择某个楼层(第k层)抛一次鸡蛋进行试探.F(N) = Min(F(N-k,2),k-1原创 2015-09-07 13:06:10 · 1107 阅读 · 0 评论 -
华为上机试题:数字问题.
摘要:给定一个数字序列11,要求第二行的序列是21,第三行是1211.每一行都是对上一行的描述.第四行是111221,即(1个1.1个2,2个1).求出第1到第11行的情况.#include "stdafx.h"#define Number 100int Find(int *A,int *B,int bound){ int x; int i = 0,j=0,count = 0,原创 2015-09-12 12:03:10 · 572 阅读 · 0 评论 -
2015腾讯在线笔试的一道编程题
摘要:昨天刚刚看了一道同学的腾讯在线笔试编程题;大致如下:要求求出未知数在1到100以内所有的可能组合,(横着第三行的等式记不清楚了,自己随便添加的符号)基本思路(1)以前没有专门刷过题,第一次遇到这种题目,首先思考了一下常用的几个算法,发现几乎都不合适,因为这道题不是求解最优化的问题,也不容易划分成问题不相干的子集求解.唯一感觉有点可能的是回溯算法,因为涉及穷举所有的可能.(2)因此思考了一下暴力原创 2015-09-07 11:17:54 · 1792 阅读 · 0 评论 -
Python练习:多人猜数字问题
[0]:网上经典问题:一个教授在三个学生背上写了三个正整数,每个学生只能看见其他两个人的,并且告诉他们数字之和是144,然后从第一个人开始循环提问:你知道三个人的数字分别是多少吗?到第五次提问(即循环到第二人)时他说我知道答案了.从你的角度,请问可能的答案是多少?[1]:这个问题看似简单,其实比较复杂,我看了知乎上大神的回答之后按照自己的思路理解了一遍,给出详细的解答:(0):首先考虑第一次提问,这原创 2016-03-03 14:16:21 · 2007 阅读 · 0 评论 -
华为笔试.利用递归进行穷举123456的所有组合情况
摘要:对于123456中间任意的插入加号或减号,求出所有可能的组合以及表达式的结果. 基本思路:(1)对于123456进行类似于回溯算法处理,首先从1开始搜索,以1开头的可能组合有1,12,123,1234,12345,123456.在第一次做决策的基础上,第一次决策如果是1…i(1=#include "stdafx.h"#include "stdio.h"#include<string.h>原创 2015-08-31 17:15:13 · 1448 阅读 · 0 评论 -
最大映射问题
给定n个字符串,每个字符串的组成字母都属于A-J,然后我们需要确定一个映射使得A-J对应0-9并且所有字符串对应的整数加起来最大。另外每一个字符串都不允许有前置0。分析分析:题目比较简单,我们分析每一个字符串中每一个字母的权重(1,10,100…),然后将所有字母的权重加起来,按照权重进行排序这样就可以获得最大映射的序列。但是由于题目要求不能有前置0,所以如果出现的字母种类达到10种,那么就需要找到原创 2016-09-20 10:21:08 · 818 阅读 · 0 评论 -
leetcode-4sum问题
题目大意是:给定一个长度为N的数组,求解里面有多少4元组(a,b,c,d)的和满足给定的target,注意四元组不能够重复(1,2,3,4)和(2,1,3,4)算同一种!分析:这个题目用C++跑O(n^3)的算法是可以过的,但是我们可以找到一种更简单的方法来解决问题。首先计算所有二元组(i,j)对应的nums[i]+nums[j]的和并且存储起来。然后将这个问题转换成为一个2sum的问题即可。下面是原创 2016-09-19 08:32:43 · 448 阅读 · 0 评论 -
求解最长单调子序列.
给定一个长度N的子序列,求出一个单调递增的最长子序列长度,子序列可以不连续。这道题我暂时只找到了O(N^2)复杂度的算法:可以把问题看作一个简单的DP问题。假设result[k]是代表以第k个元素作为结尾的某一个单调子序列的长度,那么对于第k+1个元素结尾的单调子序列,可以这样计算result[k+1]=max(1+result[i])wherearray[i]<array[k+1],ifrom0t原创 2016-09-17 12:19:23 · 633 阅读 · 0 评论 -
数字到字符串转换问题
将1->A,2->B,….26->Z,27->AA,52->AZ.容易看出来这是一个26进制转换的问题,但是需要注意一点,我们人为的舍弃了0对应的字母,为了与进制转换联系起来,将所有数字减1就变成0-25对应A-Z。def convert(num): string = '' while num: string = (chr(ord('A')+ ((num-1)%26)原创 2016-09-15 17:47:58 · 488 阅读 · 0 评论 -
如何确定一个链表中有闭环,如果有怎么确定起始点?
这个问题很有趣,首先我第一个直觉是用图论的知识来解决,但是这是不可行的.因为我们没有办法将每一个节点的信息保存起来(这样的代价过于巨大,每一个节点标志唯一的就是它本身的地址,但是地址这个信息不能直接映射为容器的下标,它的值过于巨大,所以很难存储).其次的一个思路就是联想生活中的知识了,两个人追着跑,如果有圈的话一定会相遇的.那么我们可以利用两个指针p1,p2(每次分别增1和2)来进行判断.这里又有一原创 2015-12-26 22:42:50 · 5770 阅读 · 0 评论