📜  常见算法面试问题套装1(1)

📅  最后修改于: 2023-12-03 15:25:31.386000             🧑  作者: Mango

常见算法面试问题套装1

作为程序员,算法和数据结构无论在实际工作还是面试中都是不可避免的话题。为了帮助大家更好地准备算法面试,以下是一些常见的算法面试问题套装1,希望对大家有所帮助。

1. 两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。可以假设每个输入都只有一个答案。

示例:
输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解释:nums[0] + nums[1] = 2 + 7 = 9,因此返回[0, 1]。
代码实现:
def twoSum(nums, target):
    num_dict = {}
    for i, num in enumerate(nums):
        if target - num in num_dict:
            return[num_dict[target-num], i]
        num_dict[num] = i
    return []
var twoSum = function(nums, target) {
    const numMap = new Map();
    for (let i = 0; i < nums.length; i++) {
        if (numMap.has(target - nums[i])) {
            return [numMap.get(target - nums[i]), i];
        }
        numMap.set(nums[i], i);
    }
    return [];
};
2. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回空字符串 ""。

示例:
输入:strs = ["flower","flow","flight"]
输出:"fl"
代码实现:
def longestCommonPrefix(strs):
    if not strs:
        return ""
    for i in range(len(strs[0])):
        for string in strs[1:]:
            if i >= len(string) or string[i] != strs[0][i]:
                return strs[0][:i]
    return strs[0]
var longestCommonPrefix = function(strs) {
    if (!strs.length) {
        return "";
    }
    let prefix = strs[0];
    for (let i = 1; i < strs.length; i++) {
        while (strs[i].indexOf(prefix) !== 0) {
            prefix = prefix.substring(0, prefix.length - 1);
            if (!prefix) {
                return "";
            }
        }
    }
    return prefix;
};
3. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
代码实现:
def threeSum(nums):
    res = []
    nums.sort()
    for i in range(len(nums)):
        if nums[i] > 0:
            break
        if i > 0 and nums[i] == nums[i-1]:
            continue
        l, r = i+1, len(nums)-1
        while l < r:
            total = nums[i] + nums[l] + nums[r]
            if total < 0:
                l += 1
            elif total > 0:
                r -= 1
            else:
                res.append([nums[i], nums[l], nums[r]])
                while l < r and nums[l] == nums[l+1]:
                    l += 1
                while l < r and nums[r] == nums[r-1]:
                    r -= 1
                l += 1
                r -= 1
    return res
var threeSum = function(nums) {
    nums.sort((a, b) => a - b);
    const res = [];
    for (let i = 0; i < nums.length - 2; i++) {
        if (nums[i] > 0) {
            break;
        }
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }
        let left = i + 1, right = nums.length - 1;
        while (left < right) {
            const sum = nums[i] + nums[left] + nums[right];
            if (sum < 0) {
                left++;
            } else if (sum > 0) {
                right--;
            } else {
                res.push([nums[i], nums[left], nums[right]]);
                while (left < right && nums[left] === nums[left + 1]) {
                    left++;
                }
                while (left < right && nums[right] === nums[right - 1]) {
                    right--;
                }
                left++;
                right--;
            }
        }
    }
    return res;
};
4. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例:
输入:s = "abcabcbb"
输出:3
解释:无重复字符的最长子串是 "abc",长度为 3。
代码实现:
def lengthOfLongestSubstring(s):
    res = 0
    left = 0
    char_dict = {}
    for right in range(len(s)):
        if s[right] in char_dict and char_dict[s[right]] >= left:
            left = char_dict[s[right]] + 1
        char_dict[s[right]] = right
        res = max(res, right - left + 1)
    return res
var lengthOfLongestSubstring = function(s) {
    const charMap = new Map();
    let left = 0, res = 0;
    for (let right = 0; right < s.length; right++) {
        if (charMap.has(s[right]) && charMap.get(s[right]) >= left) {
            left = charMap.get(s[right]) + 1;
        }
        charMap.set(s[right], right);
        res = Math.max(res, right - left + 1);
    }
    return res;
};
5. 盛最多水的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i, ai)。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为(i, ai)和(i, 0)。请你找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。

示例:
输入:height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
输出:49
解释:容器能够容纳水的量最大的值是49。
代码实现:
def maxArea(height):
    res = 0
    left, right = 0, len(height) - 1
    while left < right:
        res = max(res, min(height[left], height[right]) * (right - left))
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1
    return res
var maxArea = function(height) {
    let left = 0, right = height.length - 1, res = 0;
    while (left < right) {
        res = Math.max(res, Math.min(height[left], height[right]) * (right - left));
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return res;
};

以上就是常见算法面试问题套装1,希望对大家有所帮助。