![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法题
qnczmf
这个作者很懒,什么都没留下…
展开
-
剑指offer:连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2018-08-02 17:02:29 · 110 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。思路:1. 如果是数组中只有一个数字出现了奇数次,其他数字都出现偶数次,可以采用异或的方法,因为相同的数字异或结果是0,而0异或任何数字等于该数字本身。因此可以将数组中所有数字进行异或,最后剩下的就是只出现奇数次的数字。2. 如果是找数组中只出现一次的数字,也可以用哈希表记录所有...原创 2018-08-19 19:25:59 · 206 阅读 · 0 评论 -
数组中只出现一次的数字进阶(其余数字均出现3次)
题目描述:一个整型数组里除了一个数字只出现一次之外,其他的数字都出现了3次。请写程序找出这个只出现一次的数字。思路:出现3次就不能再用异或的方法了,因为三个相同的数异或还是得到本身。但是还是可以采用位运算的思想,因为出现三次的数字每个位(0或者1)也是出现三次,因此可以每一位的和能够被3整除(对3取余为0)。所以如果把每个数的二进制表示的每一位加起来,对于每一位的和,如果能被3整除,那...原创 2018-08-19 20:10:11 · 2179 阅读 · 3 评论 -
剑指offer:和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。...原创 2018-08-19 21:25:49 · 166 阅读 · 0 评论 -
剑指offer:矩阵中的路径 (leetcode:单词搜索)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2018-08-22 21:28:55 · 1347 阅读 · 0 评论 -
剑指offer:机器人的运动范围
题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:同样采用回溯法,moving...原创 2018-08-22 22:23:00 · 163 阅读 · 0 评论 -
剑指offer:构建乘积数组
题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路:方法1:最直接的,计算每个B[i],会有很多重复计算。方法2:使用辅助空间。使用两个辅助数组C[0,1,...,n-1],D[0,1,...,n-1],其中C[i...原创 2018-08-27 16:20:22 · 122 阅读 · 0 评论 -
剑指offer:正则表达式匹配
题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。思路:难点是处理有'*'的情况,用递归的方法处理起来比较方便,停止条件分为两类:...原创 2018-08-27 16:23:07 · 98 阅读 · 0 评论 -
剑指offer:滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...原创 2018-09-02 22:38:59 · 106 阅读 · 0 评论 -
剑指offer:平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:平衡二叉树的定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。直观思路是前序遍历,每遍历到一个节点,计算左右子树的深度,然后判断是否差值不超过1,一直遍历完所有节点,关于计算树的深度可以参考二叉树的深度。但是这种方法需要重复计算树的深度。因此可以采用后序遍历的方式,自下而上,...原创 2018-08-19 17:11:36 · 98 阅读 · 0 评论 -
算法题:数串分组
题意:给定一串数字,判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字之和均相同(该3个元素不纳入计算) 。要求时间复杂度和空间复杂度均不能超过O(n)。思路:方法1:用一个大小为n的array[i]存储从开头一直加到num[i]的和值,用一个hashmap存储下array的下标和对应的和值,这样实现O(1)时间复杂度的查找。先遍历一遍存下array和map。...原创 2018-08-19 16:33:30 · 1072 阅读 · 0 评论 -
网易笔试题:第x个苹果属于哪一堆
#include<iostream> #include<vector> #include<string> #include<algorithm>using namespace std; int main(){ int n; cin>>n; vector<int> a; ...原创 2018-09-03 10:29:51 · 228 阅读 · 0 评论 -
剑指offer:第一个只出现一次的字符
题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:以空间换时间。遍历一次数组,用一个256大小的hash数组存储下所有字母出现次数(下标是字母的ASCII码),再遍历一次找到第一个次数为1的数输出下标。大小设为256是因为字母的ASCII最大到255。...原创 2018-08-07 22:19:57 · 136 阅读 · 0 评论 -
剑指offer:数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。思路:方法1:最直观的方法,顺序扫描数组,每扫描到一个数字,再顺序扫描其后的每个数字,如果后面的数字比当前数字小,则组成一个逆序对。这种方法需要两层循环,O(n^2)的复杂度...原创 2018-08-11 11:45:12 · 91 阅读 · 0 评论 -
剑指offer:两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路:首先判断链表是否有公共节点,分别遍历两个链表到最后一个节点,如果最后一个节点相等,说明有公共节点。在上一步遍历时保存下两个链表的长度,dis保存两个链表的长度差,然后让fast指针指向较长的链表,slow指向较短的链表,fast先走dis步,然后fast和slow一起往后走,第一次相遇的位置就是第一个公共节点。在线测试h...原创 2018-08-12 22:13:35 · 97 阅读 · 0 评论 -
剑指offer:数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数思路:因为数组是排好序的,可以参考二分查找的思路,先用一次二分查找找到数组中第一个小于等于指定元素的下标l,再用一次二分查找找到数组中第一个大于指定元素的下标r,该数字出现的次数就是r-l 参考代码:在线测试https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae9...原创 2018-08-19 16:32:35 · 108 阅读 · 0 评论 -
剑指offer:二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:后序遍历,如果一个节点没有叶节点,则深度为1,若有子节点,先递归得到左右子树的深度,则该节点作为根节点的子树深度是左右子树的深度值中较大的一个+1,递归调用到空节点返回0。在线测试:https://www.nowcoder.com/practic...原创 2018-08-12 22:16:39 · 95 阅读 · 0 评论 -
算法题:无序栈中取出元素放入有序栈
题目:无序栈A,有序栈B,要从无序栈中取出元素放到有序栈B中使得有序,只能有一个临时变量,只能存储一个元素。思路:如果不限制使用空间,就很简单,再用一个栈存储B中暂时不能压入的元素。但是现在只能有一个临时变量,就只能利用原来的A栈完成存储的功能,c中保存每次要比较的栈顶元素。1. 用c保存A的栈顶元素,2. 如果B是空,则直接将c入B栈,A的栈顶元素出栈,3. 如果B不为空...原创 2018-08-15 16:52:12 · 931 阅读 · 0 评论 -
算法题:对只含有0,1,2三个元素的数组排序,时间复杂度O(n)
题目:将元素均为0、1、2的数组排序,时间复杂度O(n)。思路:方法1:通过三个下标遍历一遍实现的方法。p1从左侧开始,指向第一个非1的数字;p3从右侧开始,指向第一个非3的数字。p2从p1开始遍历,如果是2,p2继续遍历,直到p2遇到1或者3如果遇到1,则和p1进行交换,然后p1向右,指向第一个非1的数字如果遇到3,则和p3进行交换,然后p3向左,指向第一个非3的数字...原创 2018-08-15 17:36:50 · 4384 阅读 · 2 评论 -
leetcode:最长连续递增序列
题目:给定一个未经排序的整数数组,找到最长且连续的的递增序列。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。...原创 2018-08-19 16:35:14 · 683 阅读 · 1 评论 -
剑指offer:左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:基本的reverse用于反转字符串先将前K位反转,然后将后N-K位反转,最后将...原创 2018-08-20 21:15:18 · 92 阅读 · 0 评论 -
剑指offer:翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:微软实习面...原创 2018-08-20 21:40:03 · 100 阅读 · 0 评论 -
动态规划之0-1背包问题
题目:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?思路:用dp[i][j]表示当前背包放进i件物品后剩余容量为j对应的最大价值。当考虑第i件物品时,有装与不装两个选择。首先如果当前剩下的容量小于i的重量(j<wi),那肯定不装,因为装不了,对应的dp[i][j]=dp[i-1][j];...原创 2018-09-05 20:22:41 · 404 阅读 · 0 评论 -
数字序列中某一位的数字
题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。链接:剑指offerP225思路:寻找规律以n=1001为例,首先是一位数,有10个(0~9),1001>10,所以肯定不在这10个里面,从后面的数字开始找第1001-10...原创 2018-09-03 20:58:48 · 718 阅读 · 0 评论 -
面试题之智力题总结
1.有两根绳子,材质都不均匀,我只知道这每根绳子是1个小时烧完,问:我如何能够测算出时间是45分钟?(来自爱立信)答案:同时点燃A的1头,和B的2头,等B烧完正好半小时过去,这个时候只点燃1头的绳子A还剩下能燃烧半个小时的量,把A另一头点燃同时计时,烧完就正好45分钟。2.100层的大楼,两个水晶球,怎么样快速找到从第几层楼往下扔水晶球刚好会碎?(来自Synopsys)1)从3楼开始...原创 2019-07-26 15:20:16 · 403 阅读 · 2 评论 -
leetcode26:删除排序数组的重复项
题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为1,2.你不需要考虑数组中超出新长度后面的元素。思路:...原创 2018-09-06 15:33:18 · 136 阅读 · 0 评论 -
leetcode80: 删除排序数组中的重复项 II
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2,3 。你不需要考虑数组中超出新长度后面...原创 2018-09-06 15:54:19 · 274 阅读 · 0 评论 -
leetcode77:组合
题目描述:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]思路:回溯法,从第一个数开始遍历,组合中可以包括这个数,然后递归求得从2到n中k-1个数的组合;组合中也可以不包括这个数,列举完包括...原创 2018-09-09 16:22:35 · 193 阅读 · 0 评论 -
leetcode86:分隔链表
题目描述:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5思路:先找到第一个大于等于x的节点curr,然后继续往后...原创 2018-09-13 20:06:48 · 350 阅读 · 0 评论 -
剑指offer:扑克牌顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,...原创 2018-08-20 22:11:20 · 106 阅读 · 0 评论 -
剑指offer:字符流中第一次只出现一次的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:这道题与第一次只出现一次的字符的区别是字符流一去不复返,不能遍历两次,所以如果要用同样的方法...原创 2018-08-30 21:02:29 · 248 阅读 · 0 评论 -
剑指offer:链表中环的入口节点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:第一步,判断链表中是否有环。设置快慢两个指针,一个一次走一步,一次一次走两步,如果在快指针到达尾节点之前,两个指针相遇了,代表有环。第二步,判断环的入口。有两种方法,第一种方法很直接,首先统计环中节点数目N,然后先让一个指针从头结点开始走N步,再设置一个指针指向头结点的位置,两个指针一起往后,两...原创 2018-08-29 16:18:02 · 118 阅读 · 0 评论 -
剑指offer:圆圈中最后剩下的数字(约瑟夫环)
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....原创 2018-08-25 10:26:08 · 166 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:用位运算完成。以101和10001为例来看两数相加的过程,第一步计算不考虑进位各位相加的结果(1+1=0+0=0,1+0=0+1=1),这一步与两数异或的结果一致,第二步计算进位,只有1+1会产生进位得到10,这一步与两数相与再左移一位的结果一致,第三步将第一步与第二步结果相加,其实就是重复...原创 2018-08-27 21:36:29 · 112 阅读 · 0 评论 -
剑指offer:将字符串转换为整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路:思路其实很清晰,逐个转换数字字符,关键是一些特殊情况的处理。1. 字符串为空,直接返回02. 有非数字字符。先判断首位,如果是正负号,则是合法的,inde...原创 2018-08-24 17:47:43 · 231 阅读 · 0 评论 -
剑指offer:删除该链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:设置三个指针,pre,curr,next。curr代表当前节点,pre代表前一节点,next代表后一节点,思路是每次如果next与curr的值相等,就将n...原创 2018-08-30 17:08:21 · 137 阅读 · 0 评论 -
剪绳子(动态规划和贪婪算法)
题目:把长度为n的绳子剪成m段(n>1,m>1),每段绳子的长度记为k[1],...k[m],则每段绳子的长度的最大乘积是多少?例如身子长度为8时,剪成2,3,3三段得到的乘积最大,为18。思路:方法1:动态规划的思想假设长度为n的绳子被剪成若干段后,各段长度的最大乘积为f(n)。一刀下去可能的位置有1,2,...,n-1,j将绳子分为长度为i和n-i的两段,则f(n)...原创 2018-09-02 17:28:28 · 3280 阅读 · 0 评论 -
剑指offer:二叉树的下一节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:画一个三层的满二叉树,每个节点分析一遍找到规律。有三种情况:1. 给定节点有右子树,则下一节点是右子树的最左叶节点;2. 给定节点没有右子树,如果给定节点是其父节点的左孩子,则下一节点是父节点;3. 给定节点没有右子树,并且...原创 2018-08-29 23:00:23 · 113 阅读 · 0 评论 -
leetcode92: 反转链表 II
题目描述:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL思路:先往后遍历找到需要反转的节点作为起点(count==m),然后按照剑指offe...原创 2018-09-13 21:29:50 · 705 阅读 · 0 评论 -
剑指offer:数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:数据流中的数据需要用合适的容器存放。方法1:用数组用数组存放是比较直接的方法,将新...原创 2018-09-03 14:03:11 · 129 阅读 · 0 评论