📅  最后修改于: 2023-12-03 15:25:31.386000             🧑  作者: Mango
作为程序员,算法和数据结构无论在实际工作还是面试中都是不可避免的话题。为了帮助大家更好地准备算法面试,以下是一些常见的算法面试问题套装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 [];
};
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回空字符串 ""。
输入: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;
};
给你一个包含 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;
};
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: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;
};
给你 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,希望对大家有所帮助。