
面试算法题
szj_jojo
学无止境,环保也是
github:https://github.com/sun123zhengjun
展开
-
算法题/替换空格
题目:请实现一个函数,把字符串中的每个空格替换成”%20”,例如“We are happy.”,则输出“We%20are%20happy.”。 思路:最简单的方法,判断是不是空格,如果是就替换,时间复杂度O(n^2)(后续改进)#coding:utf-8def tihuan_kongge(s): str_arr = map(lambda x:x if x != " " else '%20原创 2017-08-30 11:21:39 · 338 阅读 · 0 评论 -
算法题/约瑟夫环
python2.7约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 m =2 n=6 [1,2,3,4,5,6]—>2 起index0=0 始:index1原创 2017-08-17 11:03:58 · 361 阅读 · 0 评论 -
算法题/排序算法
python2.7快速排序的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一原创 2017-08-18 14:47:57 · 229 阅读 · 0 评论 -
算法题/旋转数组
python2.7题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排序的数组的一个旋转(递增或递减的),输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。#coding:utf-8"""把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排序的数组的一个旋转(递增或递减的),输出旋转原创 2017-08-18 19:20:59 · 291 阅读 · 0 评论 -
算法题/丑数
python2.72、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数如果它能被2整除,我们把它连续除以2;如果能被3整除,就连续除以3;如果能被原创 2017-08-19 10:19:21 · 394 阅读 · 0 评论 -
算法题/找出数组中出现最多的数
python2.7找出数组中出现次数最多的那个元素的值。如[1,2,3,4,5,6,2,2,2,2,27,8]结果为2使用HashMap,每个Entry的key存放数组中的数字,value存放该数字出现的次数,首先遍历数组元素构造HashMap,然后遍历每个Entry,找出最大value对应的key,即是出现次数最多的那个数。此算法的时间复杂度为O(n)。#coding:utf-8def get_m原创 2017-08-19 11:11:24 · 1177 阅读 · 0 评论 -
算法题/从1到n的正数中1的出现次数
python2.7输入一个整数n,求从1到n这n个正数中,1出现的次数。例如:输入12,出现一的数字有1,10,11,12共有5个1,则输出5.最简单的方法,我们可以遍历从1到n的每一个数字k,对于k我们计算出它其中包含的1的个数,方法其实很简单,只需要分别判断个位,十位,百位,千位等的每一位是否为1,然后用计数器记录。#coding:utf-8def compute(n): total_1原创 2017-08-19 20:25:22 · 541 阅读 · 0 评论 -
算法题/杨氏矩阵
python2.7在一个 m 行 n 列二维数组中, 每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数, 判断数组中是否含有该整数首先定位到最后一行第一个元素,如果要查找的数等于这个元素,直接返回true。如果value>array[i][j],向上寻找,如果array[i][j] > num向左寻找。直到找到这个数#cod原创 2017-08-20 15:31:56 · 232 阅读 · 0 评论 -
算法题/调整数组顺序使奇数位于偶数前面
python2.7:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位予数组的后半部分。这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候, 如果发现有偶数出现在奇数的前面,我们可以交换它们的顺序,交换之后就符合要求了。 因此我们可以维护两个指针,第一个指针初始化时指向数原创 2017-08-20 15:57:18 · 267 阅读 · 0 评论 -
算法题/把数组排成最小的数
python2.7输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法最简单想法:将数组全排列,找出最小的值#coding:utf-8def arrangement(a): if len(a) == 0: return [[]]原创 2017-08-20 16:58:30 · 396 阅读 · 0 评论 -
算法题/创建二叉树
python2.7创建二叉树: #coding:utf-8#创建二叉树节点class Node(object): def __init__(self,data,left,right): self.data = data self.left = left self.right = right#创建二叉树class Tree(object):原创 2017-08-23 09:20:33 · 276 阅读 · 0 评论 -
算法题/两个队列实现栈
python2.7思想: 在进栈的时候,q2为空,向q1追加,如果q2非空,将q2全部放入q1后,在q1后面追加 出栈的时候,如果q1非空,将q1全部移到q2,将q2最后一个元素弹出,如果q1空,栈空#coding:utf-8class Stack(object): def __init__(self): self.q1 = [] self.q2 = [原创 2017-08-16 15:26:04 · 213 阅读 · 0 评论 -
算法题/两个栈实现队列
python2.7思想:入队时,将元素压入s1。 出队时,将s1的元素逐个“倒入”s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。#coding:utf-8"""两个栈实现队列"""class Queue(object): def __init__(self): self.s1 = [] self.s2原创 2017-08-16 11:28:13 · 232 阅读 · 0 评论 -
算法题/从头到尾打印链表
输入一个链表,从尾到头打印链表每个节点的值#coding:utf-8class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(原创 2017-09-20 18:58:40 · 328 阅读 · 0 评论 -
算法题/递归
环境:python2.71.递归求和1+2+3+…..+n 思想:f(1) = 1 f(2) = f(1)+2 f(3) = f(2)+3 . . . f(n) = f(n-1)+ndef add(n): if n==1: return 1 else: return(add(n-1)+n)p原创 2017-08-13 17:01:36 · 419 阅读 · 0 评论 -
算法题/背包问题
python设有一个背包可以放入的物品重量为weight,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为weight。 如果有满足条件的选择,则此背包有解,否则此背包问题无解。0- 1 背包问题如果采用递归算法来描述则非常清楚明白, 它的算法根本思想是假设用布尔函数package( weight,items n) 表示n 件物品原创 2017-08-13 17:41:01 · 1592 阅读 · 0 评论 -
算法题/求二进制数中1的个数
python 2.7输出数字的二进制中的1的个数; 判断一个数是否为2的幂快速法,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。假设n中有5个1,n&n-1可以清除n中最右边的1,生成的数中包含四个1,在继续&操作生成的数中包含3个1.。。。。判断n是否为2的次原创 2017-08-13 21:32:31 · 384 阅读 · 0 评论 -
算法题/两个数组排序
python 2.7将两个排序的数组merge成新的排好序的数组#coding:utf-8def merge(arr1,arr2): result=[] arr1len = len(arr1) arr2len = len(arr2) totallen = arr1len + arr2len i = 0 j = 0 for index in r原创 2017-08-13 21:39:31 · 1194 阅读 · 0 评论 -
算法题/位操作实现四则运算
python2.7没有加法运算符的加法实现, 没有减法运算符实现减法运算思路:5+17 101 + 10001 步骤一:无进位加法 101+10001 = 10100 (相当于101^10001) 步骤二:只记录进位 101+10001 = 10 (相当于101&10001,再左移一位) 步骤三:10100+10 = 10110 (相当于前两步结果相加)减法思路:a-b 相当于a+(原创 2017-08-14 08:51:17 · 294 阅读 · 0 评论 -
算法题/将一个字符串转换成数字
python2.7将一个字符串转换成数字 方法一:直接调用string模块中的atoi 方法二,原始方法#coding:utf-8"""方法一,引入string模块的atoi方法二,原始方法"""import string a = '12345'b = string.atoi(a)print(b,'------type of b',type(b))def str_to_numbe原创 2017-08-14 09:11:29 · 1085 阅读 · 0 评论 -
算法题/用递归实现一个字符串的全排列
python2.7算法思路: n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀); 出口:如果只有一个元素的全排列,则说明已经排完,则输出数组; 不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列;"""f(a,b,c,d,......n) = a+f(b,c,d......n) & b+f(a,c,d......n) & c+f(a,b,d....原创 2017-08-14 16:34:50 · 840 阅读 · 0 评论 -
算法题/青蛙跳台阶问题
python2.7问题一:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 f(n) = f(n-1)= 1 n=1f(n) = 1+1 = 2 n=2 当第一次跳一个台阶时,有一种方法,当第一次跳两个台阶时有一种方法f(n) = 2+1 =3 n=3 当第一次跳一个台阶时有f(3-1)中方法,当第一次跳两个台阶时有f(3-2)中方法因原创 2017-08-14 19:28:13 · 9951 阅读 · 0 评论 -
算法题/奇怪的表达式求值
python 2.7常规的表达式求值,我们都会根据计算的优先级来计算。比如/的优先级就高于+-。但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 )。现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少 思想:从左向右计算不考虑运算符的优先级,分别将数值和运算符放入两个list中#coding:utf原创 2017-08-15 09:40:59 · 455 阅读 · 0 评论 -
算法题/层次遍历二叉树
python2.7#coding:utf-8#创建二叉树class Node(object): def __init__(self.data,left,right): self.data = data self.left = left self.right = right#创建二叉树class Tree(object): def _原创 2017-08-23 10:37:58 · 346 阅读 · 0 评论 -
算法题/最大连续子序列和
对一个有n个元素的数组,求最大的连续子数组的和。数组的元素必然有正数也有负数才有意义,如果全是正数,那最大的子数组就是本身;如果全部为负数,那最大子数组就是空数组。例如下面的数组,其最大子数组序列和为187,子数组为X[2,..,6] (后续改进) 时间复杂度O(n2)思路: 【31,-41,59,26,-53,58,97,-93,-23,84】 第一轮在第一个位置为起点处找子串,s记录每加原创 2017-08-26 20:53:10 · 499 阅读 · 0 评论 -
算法题/数值的整数次方
python3题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。#coding:utf-8def Power(base,n): result = 1.0 if n == 0: return 1 elif n == 1: return base elif n <原创 2017-08-30 10:44:28 · 271 阅读 · 0 评论 -
算法题/魔法币
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要原创 2017-09-14 12:34:46 · 1998 阅读 · 0 评论 -
算法题/相反数
为了得到一个数的”相反数”,我们将这个数的数字顺序颠倒,然后再加上原先的数得到”相反数”。例如,为了得到1325的”相反数”,首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1. 输入描述:输入包括一个整数n,(1 ≤ n ≤ 10^5)输出描述:输出一个整数,原创 2017-09-14 13:02:11 · 927 阅读 · 0 评论 -
算法题/字符串碎片
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,”aaabbaaac”是由下面碎片组成的:’aaa’,’bb’,’c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。输入描述:输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母(‘a’-‘z’)输出描述:输出一个整数,表示所有碎片的平均长度,四舍五入保留原创 2017-09-14 13:40:18 · 1349 阅读 · 0 评论 -
算法题/重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。#coding:utf-8class TreeNode: def __init__(self, x): self.val = x原创 2017-09-20 19:27:56 · 215 阅读 · 0 评论 -
算法题/矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?有以下几种情形: 1⃣️target <= 0 大矩形为<= 2*0,直接return 1; 2⃣️target = 1大矩形为2*1,只有一种摆放方法,return1; 3⃣️target = 2 大矩形为2*2,有两种摆放方法,return2; 4⃣️targe原创 2017-09-20 20:21:30 · 490 阅读 · 0 评论 -
算法题/链表中倒数第K个结点
输入一个链表,输出该链表中倒数第k个结点两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。#coding:utf-8class ListNode: def __init__(self,x): self.val = x原创 2017-09-21 10:15:03 · 289 阅读 · 0 评论 -
算法题/反转链表
输入一个链表,反转链表后,输出链表的所有元素。思路:定义三个指针 node1指针指向原链表中第一个结点,且作为最后一个结点 node2指针.next指向node1结点 temp指针指向node2结点的下一个结点#coding:utf-8class LiseNode: def __init__(self,x): self.val = x self.nex原创 2017-09-21 15:54:54 · 271 阅读 · 0 评论 -
算法题/数的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)这里要注意的是,题目是判断子结构,而不是判断子树(当然子树也是子结构,但不是所有的子结构都是子树),因此,首先要做的判断应该是从A,B两棵树的根节点开始,这里利用递归的思想(若一对节点相等,则递归的判断这对节点的左右子树是不是分别相等,若一直相等,则总会先遍历完一棵树,若这棵树为B,则B为A的子结构成立,若为A原创 2017-09-21 19:26:43 · 331 阅读 · 0 评论 -
算法题/二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10原创 2017-09-25 09:28:47 · 341 阅读 · 0 评论 -
算法题/顺时针打印矩阵
python2.7对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。 给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。分析: zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不原创 2017-08-30 09:28:55 · 849 阅读 · 0 评论 -
算法题/数组中出现次数超过一半的数字
python2.7数组中出现次数超过一半的数字题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 例子说明:如输入一个长度为 9 的数组{ 1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2 。思路:利用set,统计不同数字出现的次数#coding:utf-8def half_num(a): mid原创 2017-08-29 19:37:26 · 601 阅读 · 0 评论 -
算法题/寻找第K大数
python3在N个乱序数字中查找第k大的数字 (最简单的想法,后续改进) 采用快速排序法对输入的数据进行排序,然后输出第k大个数快速排序法思路: 设置a[0]为基准数 定义一个存放小于基准数的列表low 定义一个存放大于基准书的列表high 定义一个存放基准数的列表median 将数组a中小于基准数的数据放入low,大于基准数的数据放入high,基准数放于median 递归#cod原创 2017-08-27 16:27:38 · 618 阅读 · 0 评论 -
算法题/扑克牌顺子
python3题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 分析: 0—表示大王小王可以表示任何数字 定义一个字典,其中键存放抽到的扑克牌 情况1:如果键连续为0,就结束本次循环,继续抽牌 情况2:如果键连续为某个非0数,则有重复值不可能是顺子 情况3:如果键值不连续,则进行原创 2017-08-28 10:06:32 · 760 阅读 · 0 评论 -
算法题/数组中出现1次的两个数
python2.7题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路: 1.一个数组中如果只有一个单独的数,其余的都成对出现,求这个数,就将数组中的每个数相异或就能得到单独的数 2.一个数组中有连个单独的数,其余的成对出现,将这些数相异或后,所得的数肯定不为0,所得的数最高位1是区分两个数的重点,原创 2017-08-28 14:15:06 · 275 阅读 · 0 评论