常见算法面试题
1.字符串交换位置 时间复杂度O(n) 空间复杂度O(1)
输入 "abcde" 输出 "edcba"
def jiaohuan(str1): s1 = list(str1) tmp = 0 for i in range(0, int(len(s1) / 2)): tmp = s1[i] s1[i] = s1[len(s1) - i - 1] s1[len(s1) - i - 1] = tmp return s1 list1 = jiaohuan("abcde") print("".join(list1)) # edcba
2.数组找最大值、最小值
定义了一个数组a = [1,3,4,55,29] 查找数组中最大值 定义一个for循环对数组所有元素遍历一遍时间复杂度为O(n)
def max_value(l1): min = -1 max = -1 for i in range(len(l1)): if l1[i] > max: max = l1[i] min = i print(max) max_value([1, 2, 333, 4, 5, -1])
3.降低复杂度案例、 输入数组a = [1,2,3,4,5,6,4,4,4,2] 中查找出现次数最多的数值
def max_count(l1): d1 = {} for i in l1: d1[i] = d1.get(i, 0) + 1 print(d1) max_key = -1 count_num = -1 for i, v in d1.items(): if v > count_num: count_num = v max_key = i print(max_key, count_num) max_count([1, 2, 3, 4, 5, 6, 4, 4, 4, 4])
4.栈:后进先出 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
class Solution: def isValid(self, s: str) -> bool: len_s = len(s) if len_s % 2 != 0: return False if len_s == 0: return True # 利用进栈出栈的思想 str_dict = {'(': ')', '[': ']', '{': '}'} stacked = [] for i in range(len_s): # 如果符号为左括号进行压栈 if s[i] in str_dict.keys(): stacked.append(s[i]) # 如果栈不为空且符号在右括号内且左符号和最后一个元素相等 if stacked and s[i] in str_dict.values() and s[i] == str_dict[stacked[-1]]: stacked.pop() if stacked == []: return True else: return False solution = Solution() print(solution.isValid("{[]}")) # True print(solution.isValid("{[[}")) # False
5.为支持浏览器前进和后退功能,利用栈记录历史访问信息 后进先出
first_list = [] last_list = [] def chrome_a(url): if url not in last_list and url not in first_list: # 当用户访问一个新页面 last_list.append(url) elif url in last_list: # 当用户后退一个页面 last_list.pop() first_list.append(url) else: # 用户前进一个页面 first_list.pop() last_list.append(url) for url in [1, 2, 3, 4, 5, 5, 4, 3, 4]: chrome_a(url) print(first_list) print(last_list)