算法题
be5yond
不想成为全栈的网络工程师不是好测试开发
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法题】获取单向链表中倒数第 N 个节点
思路:单向链表中,获取正数第 N 个节点的方法,只需要从 head 向后前进 N 步即可。代码:In [1]: class Node: ...: def __init__(self, value, next=None): ...: self.value = value ...: self.next = nextIn [2]: def get(n, head): ...: node = head ...: .原创 2021-09-22 10:59:02 · 553 阅读 · 0 评论 -
【算法题】合并两个有序列表
① 合并到新队列代码:In [1]: def merge(lsta, lstb): ...: merged = [] ...: while lsta and lstb: ...: if lsta[0] < lstb[0]: ...: merged.append(lsta.pop(0)) ...: else: ...: merged.app..原创 2021-09-17 20:47:40 · 445 阅读 · 0 评论 -
【算法题】使用两个栈实现一个队列
思路 ①一个最憨厚的思路就是,两个栈一个作为数据栈,一个作为临时栈,使用数据栈来存储队列数据。入队列和入栈行为完全相同。出队列时,使用另一个栈临时将栈内数据倒叙,返回栈顶数据后。 将数据存回数据栈。定义一个栈结构class Stack: def __init__(self): self.data = [] def push(self, v): self.data.append(v) def pop(self):...原创 2021-09-17 17:43:30 · 809 阅读 · 0 评论 -
【算法题】求最大递减序列
思路同:求数组中子数组的最大和代码:In [1]: def get_longest_decrease_sub_array(array): ...: cur_list = max_list = array[0:1] ...: for i in range(1,len(array)): ...: if array[i]<array[i-1]: ...: cur_list.append(array[i]) ...原创 2021-08-30 17:13:39 · 243 阅读 · 0 评论 -
【算法题】求数组中子数组的最大和
思路:其实和求数组中的最大值差不多,需要维护一个最大值,然后和当前子数组的和对比。只要当前子数组的和是大于0的,对于后面的数据就是有用的。如果当前子数组的和小于 0 了,则丢弃这个子数组,从下一个元素重新计算代码:In [1]: def get_max_sum_of_sub_array(array): ...: cur_sum, max_sum=0,0 ...: for i in array: ...: cur_sum +=i ...原创 2021-08-30 17:08:25 · 212 阅读 · 0 评论 -
【算法题】给定两个有序区间列表,找到这两个列表的交集
示例:输入: arr1=[[1, 3], [5, 6], [7, 9]], arr2=[[2, 3], [5, 7]]返回:[2, 3], [5, 6], [7, 7]输入:arr1=[[1, 3], [5, 7], [9, 12]], arr2=[[5, 10]]返回:[5, 7], [9, 10]思路:2个区间的关系, 一共有四种可能,没有交集, 部分交集,被包含, 相等。因为要求的是两个有序区间列表的交集, 使用 2个指针分别遍历一个区间列表,然后将求当前...原创 2021-08-30 16:14:15 · 478 阅读 · 0 评论 -
【算法题】判断链表是回文链表
思路:将链表反转,然后和原链表对比,如果相等即为回文链表。记录当前节点和之前和之后的节点 将当前节点的指针反转,由指向后一个节点改为指向前一个节点(没有前面节点时, 指向None) 依次处理下一个数据,直到最后一个数据,将其指向新链表的头即可代码如下, 定义一个反转链表的函数reverseIn [10]: class Node: ...: def __init__(self, value, next=None): ...: self.value原创 2021-08-26 19:59:35 · 188 阅读 · 0 评论 -
【算法题】返回单向链表的中间节点
思路如果 单向链表中的节点总数为偶数,则返回第二个中间节点。Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null ,返回 4Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> null ,返回 4同:【算法题】判断链表是否成环使用快慢两个指针,遍历单链表。 快指针步长是慢指针的2倍, 快指针遍历结束时, 慢指针所指的数据就是中间节...原创 2021-08-26 17:36:10 · 232 阅读 · 0 评论 -
【算法题】判断链表是否成环
思路:使用快、慢两个指针以不同的速度遍历链表,若块指针能再次遇到慢指针,则链表中存在环代码:In [1]: class Node: ...: def __init__(self, value, next=None): ...: self.value = value ...: self.next = next ...:In [2]: def has_cycle(node): ...: slow, fast =.原创 2021-08-26 16:54:30 · 192 阅读 · 0 评论 -
【算法题】给定两个包含退格符的字符串(由字符“#”标识),检查这两个字符串是否相等。
思路:输入 str1="xy#z", str2="xzz#", 返回为 True, 使用了回退符之后,str1 和str2 都变成了xz,所以两个字符串相等。需要一个函数返回应用过退格符之后的字符串维护一个退格符计数器, 使用一个指针从右向左遍历字符串,若字符是退格符 # , 计数器 +1.若字符不是退格符, 此时若计数器==0,返回当前字符 若计数器 > 0, 计数器 -1代码:...原创 2021-08-26 15:37:50 · 247 阅读 · 0 评论 -
【算法题】给定排序数组,求总和为 0 的三元组
思路同,【算法题】给定一个排序数字数组和一个目标 K,在数组中找到和为 K 的2个数的坐标。依次遍历数组数据,在之后的子数组中查找和为 ( - 当前值)的2个数, 这样3个数的和就是 0 了。代码:In [1]: def find_triplets_sum_to_zero(array): ...: def find_pairs_of_target_sum(arr, tar): ...: left, right = 0, len(arr)-1 ...原创 2021-08-26 14:23:26 · 260 阅读 · 0 评论 -
【算法题】给定一个排序数字数组和一个目标 K,在数组中找到和为 K 的2个数的坐标。
思路已知输入数组为排序数组, 使用两个指针从头和尾对数组进行遍历,若2数之和大于目标值, 则移动右指针,减小当前数的和;若2数之和小于目标值, 则移动左指针,增加当前数的和;直到找到目标数据,或者2个指针相遇,结束遍历。代码:In [1]: def two_index_of_target_sum(array, tar): ...: left, right = 0, len(array)-1 ...: ...: while left <...原创 2021-08-26 11:09:36 · 952 阅读 · 1 评论 -
【算法题】给定一个包含 0 和 1 的数组,如果允许用 1 替换不超过“k”个 0,请找出全为 1 的最长连续子数组的长度。
思路:使用一个窗口框出子数组, 判断如果窗口内0的个数小于等于k,则右边界增加扩大窗口。若窗口内0的个数大于k,则左边界增加减小窗口内数据。每次记录窗口size,获取最大值。思路同【算法题】求带有 K 个不同字符的最长子字符串代码In [1]: def longest_sub_array_with_k_replace(array, k): ...: max_len = 0 ...: left, right, end = 0, 0, len(array).原创 2021-08-26 10:16:45 · 1577 阅读 · 0 评论 -
【算法题】求带有 K 个不同字符的最长子字符串
思路:使用一个窗口框出字串, 判断如果窗口内字符个数小于等于k,则右边界增加扩大窗口。若窗口内字符个数大于k,则左边界增加减小窗口内数据。每次记录窗口size,获取最大值,若最大值小于k,则没有满足条件的字串,返回0.代码如下:In [1]: def longest_sub_sting_with_k_distinct(string, k): ...: max_len = 0 ...: left, right, end = 0, k, len(string).原创 2021-08-25 20:15:30 · 611 阅读 · 0 评论 -
【算法题】求长度为 K 的子数组的最大和
思路:将长度为K的子数组,依次遍历并求和,找到最大的和并返回代码如下In [1]: def max_sub_array_of_size_k(array, k): ...: max_sum = 0 ...: for i in range(0, len(array)-k+1): ...: cur_sum = sum(array[i:i+k]) ...: max_sum = max(max_sum, cur_sum) .原创 2021-08-25 19:43:24 · 1464 阅读 · 0 评论 -
【算法题】长度为n的数组,有一个数m重复出现了n/2+1次,找出这个数
最直观办法就是排序,然后找中间那个数。要求时间复杂度为O(N)的时候,利用出现了n/2+1次的特性,把这个数和其他数一一抵消,剩下的就是要求的m。利用一个栈结构def kay(lst): stack=[] for i in lst: if not stack or stack[-1]==i: stack.append(原创 2017-07-05 10:35:35 · 1017 阅读 · 0 评论 -
【算法题】找到第一个只出现一次的字符 python
面试常考题,最近几天滴滴和百度都被问过.机智如我第一时间想到的最蠢的方法就是,遍历字符串,判断当前字符是否在后面的字符串中出现。def first_uniq(s): for i in range(len(s)): if s[i] not in s[i+1:]: return(s[i])这样写,时间复杂度O(n2),而且‘aaaaa原创 2017-07-05 15:01:27 · 6129 阅读 · 0 评论 -
【算法题】在一个长度为n的数组里的所有数字都在1到n-1的范围内。 有一个数字重复若干次,找出这个数字。
一般的方法还是见一个字典保存已经出现的数字,然后判断后面的数字是否出现在字典中。def get_dup(lst): cnt={} for i in lst: if i in cnt: return i else: cnt[i]=1节省空间复杂度的方法,利用保存着1~N-1这个条件。具一个原创 2017-07-13 17:40:59 · 4669 阅读 · 0 评论
分享