首页 > 编程语言 >力扣大厂热门面试算法题 27-29

力扣大厂热门面试算法题 27-29

时间:2024-03-14 20:01:54浏览次数:20  
标签:27 divisor nums int needle 29 力扣 dividend haystack

        27. 移除元素,28. 找出字符串中第一个匹配项的下标,29. 两数相除,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.14 可通过leetcode所有测试用例

目录

27. 移除元素

解题思路

完整代码

Python

Java

28. 找出字符串中第一个匹配项的下标

解题思路

暴力匹配方法

完整代码

Python

Java

29. 两数相除

解题思路

完整代码

Python

Java


27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}
 

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

解题思路

解决移除数组中特定值元素的问题时,我们可以采取以下步骤:

  1. 双指针法

    使用两个指针:一个快指针j用于遍历数组,一个慢指针i用于指向更新后的数组的末尾。
  2. 遍历数组

    快指针j从头开始遍历数组nums
  3. 比较与目标值

    对于每个元素,检查快指针j所指的元素是否等于目标值val
  4. 更新数组

    如果当前元素不等于目标值,将快指针j所指的元素复制到慢指针i的位置,然后递增慢指针i
  5. 递增快指针

    无论是否复制了元素,快指针j都会递增,继续检查下一个元素。
  6. 返回新长度

    遍历完成后,慢指针i的位置即为新数组的长度,因为所有不等于val的元素都已经被移至数组的前i个位置。

完整代码

Python
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i = 0
        for j in range(len(nums)):
            if nums[j] != val:
                nums[i] = nums[j]
                i += 1
        return i
Java
public class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != val) {
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
}

28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

解题思路

暴力匹配方法

  1. 外层循环遍历haystack:从haystack的第一个字符开始,到"haystack的长度 - needle的长度"为止,这是因为如果剩下的字符少于needle的长度,那么肯定不会匹配成功。
  2. 内层循环遍历needle:在每个外层循环的位置,开始一个新的内层循环,比较haystack从当前外层循环索引开始的子字符串是否与needle相匹配。
  3. 匹配成功:如果内层循环成功匹配了needle的所有字符,那么返回当前外层循环的索引。
  4. 全部不匹配:如果外层循环结束都没有找到匹配项,返回-1。

完整代码

Python
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        L, n = len(needle), len(haystack)
        for start in range(n - L + 1):
            if haystack[start:start + L] == needle:
                return start
        return -1
Java
public class Solution {
    public int strStr(String haystack, String needle) {
        int L = needle.length(), n = haystack.length();
        for (int start = 0; start < n - L + 1; ++start) {
            if (haystack.substring(start, start + L).equals(needle)) {
                return start;
            }
        }
        return -1;
    }
}

29. 两数相除

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的  。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

解题思路

  1. 处理符号:首先处理被除数和除数的符号,记录最终结果的符号,并将被除数和除数都转换为正数处理。
  2. 边界情况处理:处理整数溢出的情况。
  3. 位移加速:使用位移操作来模拟除法,将除数不断左移(即乘以2),直到它大于被除数之前的最大值。
  4. 执行减法:从被除数中减去当前的除数值,同时累加结果。
  5. 重复步骤3和4:直到除数不能再从被除数中减去。
  6. 应用符号并返回结果:根据最开始记录的符号,应用到最终的结果上,并返回。

完整代码

Python
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        INT_MAX, INT_MIN = 2**31 - 1, -2**31

        # 处理符号
        sign = -1 if (dividend < 0) ^ (divisor < 0) else 1

        # 处理溢出
        if dividend == INT_MIN and divisor == -1:
            return INT_MAX

        # 取绝对值
        dividend, divisor = abs(dividend), abs(divisor)
        result = 0

        while dividend >= divisor:
            temp, i = divisor, 1
            while dividend >= temp:
                dividend -= temp
                result += i
                i <<= 1
                temp <<= 1

        return result * sign
Java
public class Solution {
    public int divide(int dividend, int divisor) {
        int INT_MAX = Integer.MAX_VALUE, INT_MIN = Integer.MIN_VALUE;

        // 处理符号
        int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;

        // 处理溢出
        if (dividend == INT_MIN && divisor == -1) {
            return INT_MAX;
        }

        // 转换为长整型,防止绝对值时溢出
        long ldividend = Math.abs((long) dividend), ldivisor = Math.abs((long) divisor);
        long result = 0;

        while (ldividend >= ldivisor) {
            long temp = ldivisor, m = 1;
            while (ldividend >= (temp << 1)) {
                temp <<= 1;
                m <<= 1;
            }
            ldividend -= temp;
            result += m;
        }

        result *= sign;
        return (int) result;
    }
}

标签:27,divisor,nums,int,needle,29,力扣,dividend,haystack
From: https://blog.csdn.net/qq_52213943/article/details/136720205

相关文章

  • 力扣大厂热门面试算法题 24-26
            24.两两交换链表中的节点,25.K个一组翻转链表,26.删除有序数组中的重复项,每题做详细思路梳理,配套Python&Java双语代码,2024.03.14 可通过leetcode所有测试用例。目录24.两两交换链表中的节点解题思路递归思路迭代思路完整代码PythonJava25.K个......
  • CF1927G. Paint Charges
    Problem-1927G-Codeforces做这道题的时候自己把\(dp\)式子卡的太死了,导致怎么想都想不出来,但正解的\(dp\)设的是很宽松的设\(dp_{i,j,k}\)表示考虑前\(i\)个数,所有中第一个没被染色的是\(j\),在\(i\)后面第一个没被染到的是\(k\)转移就判断第\(i\)个数......
  • P1829 / SP8099 Crash的数字表格 题解
    P1829/SP8099Crash的数字表格题解莫比乌斯反演、数论分块、杜教筛。题目传送门题意简述求以下式子的值,对\(20101009\)(一个质数)取模:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m\operatorname{lcm}(i,j)\]\(n,m\le10^7\)。加强:\(n,m\le10^{10}\)。解法莫比乌斯反......
  • KubeSphere 社区双周报|2024.02.29-03.14
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.02.29-03.14。贡献者名单新晋KubeSpherecontribu......
  • [LeetCode] 2789. Largest Element in an Array after Merge Operations
    Youaregivena0-indexedarraynumsconsistingofpositiveintegers.Youcandothefollowingoperationonthearrayanynumberoftimes:Chooseanintegerisuchthat0<=i<nums.length-1andnums[i]<=nums[i+1].Replacetheelementnums......
  • leetcode: 2789. 合并数组中的最大元素
    给你一个下标从 0 开始、由正整数组成的数组 nums 。你可以在数组上执行下述操作 任意 次:选中一个同时满足 0<=i<nums.length-1 和 nums[i]<=nums[i+1] 的整数 i 。将元素 nums[i+1] 替换为 nums[i]+nums[i+1] ,并从数组中删除元素 nums[i] ......
  • 278. 第一个错误的版本c
    //TheAPIisBadVersionisdefinedforyou.//boolisBadVersion(intversion);intfirstBadVersion(intn){inthead=1,tail=n;if(isBadVersion(head))return1;while(head<=tail){intmid=head+(tail-head)/2;if(isBadVersion(......
  • 【转载】学术科研无从下手?27 条机器学习避坑指南,让你的论文发表少走弯路
    原作者链接:https://blog.csdn.net/HyperAI/article/details/128866164 内容一览:如果你刚接触机器学习不久,并且未来希望在该领域开展学术研究,那么这份为你量身打造的「避坑指南」可千万不要错过了。关键词:机器学习科研规范学术研究机器学习学术小白,如何优雅避坑坑、让自己的......
  • 洛谷 P2730 魔板 题解 DFS(广度优先搜索)
    题目背景在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有 8 个大小相同的格子的魔板:12348765题目描述我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左......
  • 代码随想录算法训练营第四十五天 | 279.完全平方数,322. 零钱兑换,70. 爬楼梯 (进阶)
    57.爬楼梯(第八期模拟笔试)时间限制:1.000S空间限制:128MB题目描述假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬至多m(1<=m<n)个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。输入描述输入共一行,包含两个正整数,分......