算法真实面试篇

333 阅读2分钟

拼接2个字符串

题目描述

给出字符串a和b,输出a和b交叉后的字符串。对该程序进行测试用例的设计。

示例

输入:给定'abdhsn','des'

返回值:'adbedshsn'

解题思路

遍历较短的那个字符串,按顺序插入列表中,再转换为字符串

def mergeString(a, b):
	if not isinstance(a, str):
		raise TypeError("a is not str")
	if not isinstance(b, str):
		raise TypeError("b is not str")
	if not a and not b: return ''
	if not a: return b
	if not b: return a
	la = len(a)
	lb = len(b)
	result = []
	if la <= lb:
		for i in range(la):
			result.append(a[i])
			result.append(b[i])
		return ''.join(result) + b[i+1:]
	else:
		for i in range(lb):
			result.append(a[i])
			result.append(b[i])
		return ''.join(result) + a[i+1:]
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

找出长度最长的纯字母

题目描述

给你一串字符串包含数字字母特殊符号,找出其中长度最长的纯字母。例:

示例

输入:‘12345abcdef¥%abde&*234hurry@#’

返回值:‘abcdef’

解题思路

正则匹配所有纯字母的字符串,返回长度最长的一个

import re

def findLongestStr(s):
	pattern = re.compile(r'[a-zA-Z]+')
	s1 = re.findall(pattern, s)
	max_len = max(len(i) for i in s1)
	result = []
	for i in range(len(s1)):
		if len(s1[i]) == max_len:
			result.append(s1[i])
	return result
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

寻找峰值

题目描述

峰值元素是指其值大于左右相邻值的元素。

给你一个输入数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设nums[-1] = nums[n] = -∞ 。

示例

输入:nums = [1,2,1,3,5,6,4]

返回值:1或5

解释:你的函数可以返回索引 1,其峰值元素为2;或者返回索引 5, 其峰值元素为 6。

解题思路1

找到列表中的最大值,肯定为峰值,返回其索引即可

def findPeakElement(nums):
    l = len(nums)
    if l == 1:return 0
    m = max(nums)
    for i, num in enumerate(nums):
        if num == m:
            return i
            
def findPeakElement(nums):
    return nums.index(max(nums))
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

解题思路2

由于题目假设nums[-1]=nums[n]=-∞。所以,我们从0开始往后遍历元素,如果某个元素大于其后面的元素,则该元素就是峰值元素。因为如果当前元素小于前一个元素,那么当前元素肯定不是峰值,所以只要循环判断是否大雨其后面的元素即可。如果遍历完发现没有满足条件的元素,则返回最后一个元素索引即可,因为nums[n] = -∞ 。

def findPeakElement(nums):
    l = len(nums)
    if l == 1:return 0
    for i in range(l-1):
        if nums[i] > nums[i+1]:
            return i
    return l-1
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

解题思路3

二分查找法 规律一:如果nums[i] > nums[i+1],则在i之前一定存在峰值元素 规律二:如果nums[i] < nums[i+1],则在i+1之后一定存在峰值元素

def findPeakElement(nums):
    left = 0
    right = len(nums)-1
    while left < right:
        mid = left + int((right-left)/2)
        if nums[mid] > nums[mid+1]:
            right = mid
        else:
            left = mid + 1 
    return left
  • 时间复杂度:O(logN)
  • 空间复杂度:O(1)

找出字符串中出现最多的元素及出现次数

题目描述

给定一个字符串,找出其中出现次数最多的元素及次数

示例

输入:给定'abcdeeffffuueeee'

返回值:(['f','e'], 4)

解题思路

定义一个max_num和max_letters,如果元素次数大于max_num,则清空max_letters,如果等于,则放入max_letters。最终输出时对元素进行重复元素的过滤。

def findMosttimesStr(s):
	if not s: return None
	max_num = 0
	max_letters = []
	for i in s:
		if s.count(i) > max_num:
			max_letters = []
			max_num = s.count(i)
		elif s.count(i) == max_num:
			max_letters.append(i)
	if max_num == 1 : return (s, 1)
	return (list(set(max_letters)), max_num)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

找出字符串中出现最多的元素及出现次数

题目描述

给定一个字符串,找出其中出现次数最多的元素及次数

示例

输入:给定'abcdeeffffuueeee'

返回值:(['f','e'], 4)

解题思路

定义一个max_num和max_letters,如果元素次数大于max_num,则清空max_letters,如果等于,则放入max_letters。最终输出时对元素进行重复元素的过滤。

def findMosttimesStr(s):
	if not s: return None
	max_num = 0
	max_letters = []
	for i in s:
		if s.count(i) > max_num:
			max_letters = []
			max_num = s.count(i)
		elif s.count(i) == max_num:
			max_letters.append(i)
	if max_num == 1 : return (s, 1)
	return (list(set(max_letters)), max_num)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)