网站直播用php怎么做重庆市建设工程信息网站诚信分
2026/1/20 20:09:18 网站建设 项目流程
网站直播用php怎么做,重庆市建设工程信息网站诚信分,南丰网站建设,网站如何快速被百度收录面试经典150题之移除元素 一、题目 1.题目描述 给你一个数组 nums 和一个值 val#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k#xff0c;要通过此题你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k要通过此题您需要执行以下操作更改 nums 数组使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。返回 k。2.题目分析这是一道移除数组中元素的题目我们需要做到原地移除但是题目说了不会去管超过我们返回给它的值之后的数字因此我们有两种思路一种是直接将所有等于val的数字全部都移动到第k个数之后并且这种方法是基于交换的即整个数组包含的数是没有变的另一种是将所有不等于val的数直接排到前K个而不管k之后是否有不等于val的数。下面我将介绍4种方法并且对我踩的一些坑也简要的说明。二、具体方法1.直接用remove函数解决whilevalinnums:nums.remove(val)returnlen(nums)由于remove函数能够直接删去列表中第一个匹配的值因此直接适用能够删去列表中所有等于val的值。这种方法相对简单但是前提是我们要知道remove函数的用法。2.新列表承接再替换num_true[iforiinnumsifi!val]foriinrange(len(num_true)):nums[i]num_true[i]returnlen(num_true)我们可以用一个全新的列表来讲数组中所有的符合要求的值全部都记录下来然后再讲这个新的列表的值按顺序插入到原来的列表中去。这种方法也很简单不太符合题目的要求因为题目要求原地排序不过在日常我们自己的代码中需要的时候可以使用。下面我将介绍两种相对来说比较有意思的方法3.以栈的思维来看数组defremoveElement(self,nums,val): :type nums: List[int] :type val: int :rtype: int stack_size0forxinnums:ifx!val:nums[stack_size]x stack_size1returnstack_size我们将nums数组看做一个栈在我们没有看这个数组之前我们没有确定栈里面的任意一个元素因此初始的栈的大小为0。然后我们遍历数组的元素如果这个元素不为val我们就把这个数组压入栈中并且将栈的大小也进行相应的调整。最后我们返回栈的大小。4.双指针置换法defremoveElement(self,nums,val): :type nums: List[int] :type val: int :rtype: int left0rightlen(nums)-1whileleftright:if(nums[left]val)and(nums[right]!val):tempnums[right]nums[right]nums[left]nums[left]temp left1right-1elif(nums[right]val):right-1else:left1returnleft这个方法的核心思路就是要设立两个指针一个一开始指向最左端一个刚开始指向最右端。然后将所有为val的值都移到数组的右边。如果左指针指向的值为val且有指针指向的值不为val的话我们就将左指针指向的值和有指针指向的值交换并且左指针右移右指针左移。不论左指针是否为val只要右指针为val就将右指针左移。这里我们可以具体的解释一下如果左指针指向的数不为val且右指针指向的值为val的话当前右指针指向的位置已经为val了所以我们要往前找到不是val的进行再进行操作。如果左右都是我们可以通过移动右指针来转换为第一种情况最后一种情况也就是左指针指向的不是并且右指针指向的也不是那么我们将左指针向右移动即可右指针不需要一定因为右指针指向的人这个地方还可以换成val但是现在没有换最后结束的条件就是左指针比右指针大了返回值就为左指针的数值。三、我踩的坑我一开始些的代码是下面这样的defremoveElement(self,nums,val): :type nums: List[int] :type val: int :rtype: int foriinnums:ifival:nums.remove(i)returnlen(nums)乍一看我的这个代码和前面的第一种方法的代码很像但是为什么我这样些就不行呢因为for i in nums 循环是基于列表迭代器实现的迭代器会按顺序读取列表的索引0→1→2→…。在循环中执行 nums.remove(i) 时列表长度变短、元素前移迭代器的指针会跳过部分元素导致漏删。后面我又尝试用for i in range (len(nums)):进行迭代 但是这样也是错的一旦在某次循环中又元素删除的话那么len(nums)就会随着改变会出现和上面一样的问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询