首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法题:把列表右侧 k 位数依次移动到左侧

给定一个非空列表和一个非负整数 k,把列表右侧的 k 位依次移动到左侧。例如:[1, 2, 3, 4, 5, 6],n 为3,则移动以后,变为:[4, 5, 6, 1, 2, 3]。...target_list, k): for i in range(k): target_list.insert(0, target_list.pop()) 其中,列表的.pop()方法每次可以从列表中返回并删除最右侧的一个元素...再使用.insert()把弹出的这个数插入到列表的最左侧。 但这样做有一个问题——虽然.pop()的时间复杂度为 O(1),但是.insert()的时间复杂度为 O(n)。...也就是说,当我在列表最左侧插入一个元素时,列表里面每一个元素都要向右移动 1 位。如果我们要把列表里面右侧 k 个数依次移动到列表左侧,时间复杂度就是O(kn)。

28210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    我对一道常考面试题的详细分析

    移动零 题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。...那么,fast-slow 正是索引从0~fast区间范围内0元素的个数。 fast指向下一个元素: ? 若打问号元素为0,根据每步操作的目标是非零元素前移,零元素后移。...所以迭代到此处时它已经为0元素,所以至少肯定不用前移,那么就保持原地不动。 若打问号的元素取值非0,根据每步操作的目标是非零元素前移,零元素后移。...因为slow~fast这块都为0,所以为了目标,非零元素要和第一个0交换,这样不就实现非零元素前移,零元素后移的目标了吗 ? 交换后: ? 你看确实前进一步了吧。...求解代码 以上分析过程就是此问题的一个中间状态的操作分析,是从第i次迭代状态到第i+1次迭代状态的变化过程。

    75510

    scrollIntoView()方法导致整个页面产生偏移

    问题描述 今天在做页面UI改版的时候发现,我之前使用的是dom.scrollIntoView(); 使得点击右侧题目编号的时候,让左侧题目滚动到页面可视区域。...,当点击题目编号的时候,除了题目会滚动到可视区域,整个页面也会稍稍往上滚动,导致页面错位。...如下图所示,当我点击第9题的时候,左侧第9题移动到视口中,但是整个页面包括导航栏都往上移动了,且无法在移回来,整个页面是没有滚动条的。 ?...(简单来说就是元素相对父元素上边的距离) 这段代码好理解,就是当前需要显示的元素距离父元素顶部的距离,也就是滚动条滚动的高度。...这段代码执行后,就可以让该元素到达父元素顶部的位置。 注意事项:offsetTop 不一定是相对于父元素的,如果有很多父元素的话,它是相对于第一个定位的父元素的。

    4.3K40

    Redis:10---List对象

    其中偏移量为start和偏移量为end的元素也会包否在被返回的元素之内LTRIMLTRIM key-name start end-对列表进行修剪,只保留从start偏移量到end偏移量范围 内的元素,其中俯移量为...source-key dest-key 从source-key列表中弹出位于最右端的元素,然后 将这个元素推入dest-key列表的最左端....在右侧客户端中向new_list中压入一个元素,可以看到左侧返回 ? BRPOPLPUSH命令演示案例 左侧等待source_list中有键值可以移动到dest_list中 ?...右侧向source_list压入值,左侧看到成功返回 ? 查看source_list中的值,可以看到没有了(已经移动到dest_list列表中了),右侧查看dest_list列表 ?...四、使用场景 ①消息队列 如下图所示,Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素

    1.3K20

    【化解数据结构】详解堆结构,并实现最小堆结构

    实现 getLeftIndex 方法 同样的根据秘诀:左侧子节点在数组中的位置是 2 * index + 1 getLeftIndex(i) { return i * 2 + 1 } 5....实现 getRightIndex 方法 右侧子节点在数组中的位置是 2 * index + 2 getRightIndex(i) { return i * 2 + 2 } 6....,则进行上移(因为最小堆,小的在堆顶) 直至递归结束 shirtUp(index) { // 如果在堆顶,停止上移 if(index == 0) return // 获取父元素...实现 insert方法 在写好了上移 shirtUp 方法,我们就可以实现 insert 方法来看看我们实现的效果了 insert 方法的作用是插入一个元素,在堆中插入一个元素之后,我们需要通过 shirtUp...数据流中的第 K 大元素 总结 在这篇文章中我们详细讲解了,什么是一个堆,如何实现一个堆,到最后手写封装了一个最小堆,在这过程中我们知道了如何将一个元素插入堆中,如何获取堆中的特定元素。

    61630

    【化解数据结构】详解堆结构,并实现最小堆结构

    实现 getLeftIndex 方法 同样的根据秘诀:左侧子节点在数组中的位置是 2 * index + 1 getLeftIndex(i) { return i * 2 + 1 } 5....实现 getRightIndex 方法 右侧子节点在数组中的位置是 2 * index + 2 getRightIndex(i) { return i * 2 + 2 } 6....,则进行上移(因为最小堆,小的在堆顶) 直至递归结束 shirtUp(index) { // 如果在堆顶,停止上移 if(index == 0) return // 获取父元素...实现 insert方法 在写好了上移 shirtUp 方法,我们就可以实现 insert 方法来看看我们实现的效果了 insert 方法的作用是插入一个元素,在堆中插入一个元素之后,我们需要通过 shirtUp...数据流中的第 K 大元素 总结 在这篇文章中我们详细讲解了,什么是一个堆,如何实现一个堆,到最后手写封装了一个最小堆,在这过程中我们知道了如何将一个元素插入堆中,如何获取堆中的特定元素。

    52910

    LeetCode 03无重复字符的最长子串(滑动窗口)

    子序列:不一定是连续的,但是要保证各个元素之间相对位置不变。 处理思路? 暴力查找,暴力查找当然是可以的,但是复杂度过高这里就不进行讲解了。...本题选择的思路是滑动窗口,滑动窗口,就是用一个区间从左往右,右侧先进行试探,找到区间无重复最大值,当有重复时左侧再往右侧移动一直到没重复,然后重复进行。在整个过程中找到最大的那个空间返回即可。...right往右移动,同时记录易懂经过元素的个数。当遇到重复即存在该元素的时候暂停。比较这个长度(right-left+1)与max的大小,max是否需要更新。 ?...直到移动到right位置相同字母的右侧说明当前窗口没有重复序列了,继续循环执行到结束。 ?...在这里插入图片描述 当然,最长的情况也在其中,因为我们只要不重复right就会右移,不能移的时候前一个即可能是最大长度: ? 你可能会问,用什么存储这个词数呢?

    68140

    看动画学算法之: 排序 - 快速排序

    最后就得到了一个所有元素都排序的数组。 快速排序的java代码实现 我们先来看最核心的部分partition,如何将数组以中间节点为界,分成左右两部分呢?...首先我们选择最左侧的元素作为中间节点的值。然后遍历数组中的其他元素。 假如m=middleIndex,k=要遍历的元素index 考虑两种情况,第一种情况是数组中的元素比中间节点的值要大。 ?...现在m+1位置的元素要么还没有进行比较,要么就是比中间节点的值要大,我们可以巧妙的将m+1位置的元素和k位置的元素互换位置,这样仍然能够保证m左侧的元素要比中间节点的值要小。...index的元素互换下位置,这样就将中间节点移动到了中间位置,并返回中间位置。...随机快速排序的java实现 上面的例子中,我们的中间节点的选择是数组的最左元素,为了保证排序的效率,我们可以从数组中随机选择一个元素来作为中间节点。

    58631

    文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题

    在后续的交换操作中,我们需要将新元素的值增加到所需的值,是因为堆中的节点是按照从大到小的顺序排列的。...如果新元素的值比堆顶元素的值小,则新元素应该放在堆顶元素的右侧;如果新元素的值比堆顶元素的值大,则新元素应该放在堆顶元素的左侧。...例如,如果我们在堆顶元素的右侧插入一个新元素,那么在后续的操作中,我们可能会将新元素与堆顶元素进行比较,并将其移动到堆顶元素的左侧,这样就会导致堆的结构发生变化,从而使得堆的性质发生变化。...将新节点的关键字设置为 -∞ 可以保证它的值小于父节点的值,以便将其上移。在完成插入操作后,我们会将关键字更新为实际的所需值,这样就可以恢复堆的性质。...在最坏的情况下,新节点可能需要从树的根节点一直上升到树的叶子节点,但由于我们使用 -∞ 来暂时代替新节点的值,这种上移的过程可以在常数时间内完成。 在这里插入图片描述

    19630

    四. css 布局之 float

    1. float 简介 通过浮动可以使一个元素向其父元素的左侧或右侧移动 使用 float 属性来设置于元素的浮动: 可选值: none 默认值 ,元素不浮动 left 元素向左浮动 right 元素向右浮动...,不再占据文档流中的位置 2、设置浮动以后元素会向父元素的左侧或右侧移动, 3、浮动元素默认不会从父元素中移出 4、浮动元素向左或向右移动时,不会超过它前边的其他浮动元素 5、如果浮动元素的上边是一个没有浮动的块元素...2、设置浮动以后元素会向父元素的左侧或右侧移动, 3、浮动元素默认不会从父元素中移出...,其会完全脱离文档流,子元素从文档流中脱离,将会无法撑起父元素的高度,导致父元素的高度丢失 父元素高度丢失以后,其下的元素会自动上移,导致页面的布局混乱 所以高度塌陷是浮动布局中比较常见的一个问题,这个问题我们必须要进行处理...clear属性来清除浮动元素对当前元素所产生的影响 clear 作用:清除浮动元素对当前元素所产生的影响 left 清除左侧浮动元素对当前元素的影响 right 清除右侧浮动元素对当前元素的影响 both

    75120

    面试中常用排序算法实现(Java)

    ,但通常会直接选择序列的第一个元素作为一个标准,所有比该元素值小的元素全部移动到他的左边,比他大的都移动到他的右边。...从high指针位置开始扫描整个序列,如果high指针所指向的元素值大于等于临界值,指针前移。如果high指针所指向的元素的值小于临界值的话: ?...然后从low指针开始,逐个与临界值进行比较,如果low指向的元素的值小于临界值,那么low指针前移,否则将low指针所指向的当前元素的值交换给high指针所指向的当前元素的值,然后把high指针前移。...if(i==(low+high)/2+1){ arrCopy[key] = array[j]; j++; } //如果右侧数组长度小于左侧数组长度...,当右侧数组全部入库之后,左侧数组不用做比较直接入库 else if(j==high+1){ arrCopy[key]=array[i];

    70590

    LeetCode 77,组合挑战,你能想出不用递归的解法吗?

    我们可以想象一下,一开始的时候滑动框都聚集在最左边,我们要移动只能移动最右侧的滑动框。我们把滑动框从k移动到了k+1,那么这个时候它的右侧有k-1个滑动框,一共有k个位置。...首先,我们需要把这k-1个滑动框全部移动到左侧,然后再移动其中最右侧的滑动框。然后循环往复,直到所有的滑动框都往右移动了一格为止,这其实是一个递归的过程。...这个时候剩下的局面就是,为了获取这些组合,我们需要把这m个滑动框全部再移动到直尺的最左侧,重新开始移动。 我们在实现的时候当然没有滑动框,我们可以用一个数组记录滑动框当中的元素。...,递归 if m > 0: # 把左侧的滑动框全部移动到最左侧 window[:m] =...# 如果滑动框与它右侧滑动框挨着,那么就将它移动到最左侧 # 因为它右侧的滑动框一定会向右移动 while j < k and

    50610

    ​LeetCode刷题实战77:组合

    我们可以想象一下,一开始的时候滑动框都聚集在最左边,我们要移动只能移动最右侧的滑动框。我们把滑动框从k移动到了k+1,那么这个时候它的右侧有k-1个滑动框,一共有k个位置。...首先,我们需要把这k-1个滑动框全部移动到左侧,然后再移动其中最右侧的滑动框。然后循环往复,直到所有的滑动框都往右移动了一格为止,这其实是一个递归的过程。...,为了获取这些组合,我们需要把这m个滑动框全部再移动到直尺的最左侧,重新开始移动。 我们在实现的时候当然没有滑动框,我们可以用一个数组记录滑动框当中的元素。...,递归 if m > 0: # 把左侧的滑动框全部移动到最左侧 window[:m] =...# 如果滑动框与它右侧滑动框挨着,那么就将它移动到最左侧 # 因为它右侧的滑动框一定会向右移动 while j < k and

    35810

    「大众点评点餐」小程序开发经验 03:事件联动

    下方左侧、右侧可分开滚动,滚动左侧不影响右侧,滚动右侧左侧随之联动高亮显示所在的菜单分类。...通过查看 scroll-view 的相关文档,我们发现,可以使用 scroll-into-view 属性,自动定位右侧需要滚动到的具体位置。...右侧栏滚动事件与分类栏自动滚动 滑动右侧、让左侧滚动,是整个页面设计最核心的部分。 由于小程序无法获取元素的宽高,位置信息,滚动右侧实现左侧联动效果的实现难度非常高。...如何准确的获取右侧滚动到的具体分类,并让左侧导航菜单栏相应分类高亮,且在可视的范围内? 在设计阶段,我们和设计同学确认右侧每个视觉模块固定的高度,包括菜品模块高度、分类小灰条高度等。...这样,我们就可以根据已有的数据结构,计算出每个元素距离文档区顶部的高度。 ? ? 左侧导航菜单栏高亮分类切换的边界条件为:右侧分类菜单详情的分类小灰条顶部,与右侧滚动区顶部重合。

    2.6K40

    第 13 章 拷贝控制

    如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有一个 const成员(无法被重新赋值),或是引用成员(赋值之后,左侧对象仍然指向赋值前对象,而不会与右侧运算对象指向相同的对象),则类的合成拷贝赋值运算符被定义为删除的...在重载拷贝赋值运算符时,要注意处理自赋值情况,一个较好的方法是在销毁左侧运算对象之前先拷贝右侧运算对象。 拷贝一个像值的对象时,副本和原对象是完全独立的。...定义 swap的类通常用 swap来定义它们的赋值运算符,使用了拷贝并交换的技术,将左侧运算对象与右侧运算对象的一个副本进行交换。这种技术自动就是异常安全的,且能正确处理自赋值。...vector在执行 push_back时,vector可能会重新分配内存空间,会将元素从旧空间移动到新空间。...= &rhs) { free(); // 释放左侧内存 elements = rhs.elements; // 从 rhs接管资源 first_free

    1K50

    算法与数据结构(七):快速排序

    快速排序的基本思想如下: 在一组无序元素中,找到一个数作为基准数。 将大于它的数全部移动到它的右侧,小于它的全部移动到右侧。...在分成的两个区中,再次重复1到2 的步骤,直到所有的数全部有序 下面还是来看一个例子 [3,6,1,2,8,4,7] 首先选取一个基准数,一般选择序列最左侧的数为基准数,也就是3,将小于3的数移动到...3的左边,大于3的移动到3的右边,得到如下的序列 [2,1,3,6,8,4,7] 接着针对左侧的[2, 1] 这个序列和 [6, 8, ,4, 7]这两个序列再次执行这种操作,直到所有的数都变为有序为止...调整的算法如下: 首先定义两个指针,指向最右侧和最左侧,最左侧指针指向基准数所在位置 ?...接着再次从右往左扫描,直到找到小于基准数的值;并再次改变扫描顺序,直到调整完毕 ?

    55910
    领券