剑指offer
剑指offer相关算法题
程序员进化者
这个作者很懒,什么都没留下…
展开
-
03-找出数组中重复的数字-python
题目:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数字中的某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出时重复的数字2或者3。# 1、使用字典def duplicate(nums): dic = {} res = [] ...原创 2019-08-12 19:18:00 · 363 阅读 · 0 评论 -
04-二维数组中的查找-python
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数组。def matrix_find(matrix,n): i,j=0,len(matrix[0])-1 while i<=len(matrix) and j>=0: if m...原创 2019-08-12 19:24:00 · 92 阅读 · 0 评论 -
05-替换空格-python
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。def replace_space(s): s = list(s) l1 = len(s) cnt = 0 if l1<1: return None for ss in s: ...原创 2019-08-12 19:33:00 · 161 阅读 · 0 评论 -
06-从尾到头打印链表-python
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。class ListNode(object): def __init__(self): self.val = None self.next = None def add(self,val): node = ListNode() node.val...原创 2019-08-12 19:37:00 · 73 阅读 · 0 评论 -
08-二叉树的下一个节点-python
题目:给定一棵二叉树和其中其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左右子节点的指针,还有一个指向父节点的指针。def treeof2_next_node(head,node): hnode = head p = node if not hnode: return None if p.right: ...原创 2019-08-12 20:33:00 · 80 阅读 · 0 评论 -
09-用两个栈实现队列-python
题目1:用两个栈实现一个队列class Stack2Queue(object): def __init__(self): self.stack1 = [] self.stack2 = [] def push(self,var): self.stack1.append(var) def pop(self): ...原创 2019-08-12 20:38:00 · 79 阅读 · 2 评论 -
10-斐波那契数列-python
题目1:求斐波那契数列的第n项题目2:青蛙跳台问题def fibonacci2(n): num1, num2 = 1, 1 if n <= 0: return 0 if n == 1: return 1 i = 3 while i <= n: res = num1 + num2 ...原创 2019-08-12 20:42:00 · 784 阅读 · 0 评论 -
11-旋转数组的最小数字-python
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。def minR(arr): if len(arr)<1: return 0 if len(arr) == 1: return arr[0] begin, end = 0, len(arr)-1...原创 2019-08-12 21:36:00 · 77 阅读 · 0 评论 -
12-矩阵中的路径-python
题目:判断一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵汇总的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。def has_path(matrix,string): rows=len(matrix) cols=len(matrix[0]) # 已经访问过的矩阵元素 ...原创 2019-08-12 21:51:00 · 198 阅读 · 0 评论 -
13-机器人的运动范围-python
题目:地上有一个m行n列d方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。def robot_move(rows,cols,k): if rows<0 or cols<0 or k<0: return 0 visited = [[0 for i in...原创 2019-08-13 21:16:00 · 85 阅读 · 0 评论 -
14-剪绳子-python
题目:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,且都大于1),每段绳子的长度记为k[0],k[1],...k[m]。请问k[0]*k[1]*k[2]*...*k[m]可能的最大成绩是多少?def max_product_cut(n): if n<2: return 0 if n == 2: return 1 ...原创 2019-08-13 21:27:00 · 128 阅读 · 0 评论 -
15-二进制中1的个数-python
题目:请实现一个函数,输入一个整数,输出该二进制表示中1的个数。# 方法1def num_of_1(n): cnt = 0 flag = 1 while flag: if n & flag: cnt += 1 flag = flag << 1 return cnt# 方法...原创 2019-08-13 21:33:00 · 105 阅读 · 0 评论 -
16-数值的整数次方-python
题目:实现函数Power,求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。def power(b,n): if n==0: return 1 if n<1: return 1/power(b,-1*n) if n%2: return b*power(b,n-1) retur...原创 2019-08-14 09:38:00 · 138 阅读 · 0 评论 -
17-打印从1到最大的n位数-python
题目:输入数字n,按顺序打印从1到最大的n位十进制数。(大整数问题)def print_max_n(n): res = [0 for i in range(n)] while not is_max(res): res=list_plus_1(res) print(res)def is_max(arrys): for arr ...原创 2019-08-14 10:33:00 · 123 阅读 · 0 评论 -
18-删除链表的节点-python
题目:给定单向链表的头指针和一个节点指针,在O(1)时间内删除链表节点。def delete_list_node(root,rp): # 只有一个结点的情况 if root == rp: root = root.next del rp return root # 删除的是最后一个结点的情况 if rp....原创 2019-08-14 10:46:00 · 107 阅读 · 0 评论 -
21-调整数组顺序使奇数位于偶数前面-python
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。def reorder_odd_event(arry): if len(arry)<2: return arry begin,end = 0,len(arry)-1 while begin<end: ...原创 2019-08-14 19:33:00 · 149 阅读 · 1 评论 -
22-链表中倒数第k个节点-python
题目:输入一个链表,输出该链表中倒数第k个节点。def find_Kth_tail(head,k): if not head or k<1: return None p = head q = head cnt = 0 while p: cnt+=1 p=p.next if ...原创 2019-08-14 19:46:00 · 153 阅读 · 0 评论 -
23-链表中环的入口节点-python
题目:如果一个链表中包含环,如何找出环的入口节点。# 找出环状链表的分支结点def has_cir(head): if not head: return False p = head q = head while p: p=p.next if p: p=p.next ...原创 2019-08-14 19:53:00 · 80 阅读 · 0 评论 -
24-反转链表-python
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。def reverse_list(head): if not head or not head.next: return head rear = head p = head.next if p.next == None: p.next=rea...原创 2019-08-14 20:05:00 · 98 阅读 · 0 评论 -
25-合并两个排序链表-python
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。def union(head1,head2): p = head1 q = head2 if not p: return q if not q: return p head = Node() h = head whil...原创 2019-08-15 20:14:00 · 109 阅读 · 0 评论 -
35-复杂链表的复制-python
题目:请实现一个函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext指针指向下一个节点,还有一个m_pSibling指针指向链表中的任意节点或者nullptr。def complex_list_clone(head): node = Node() if not head: return None if not head.nex...原创 2019-08-21 19:00:00 · 105 阅读 · 0 评论 -
38-字符串的排列-python
题目:输入一个字符串,打印出该字符串中字符的所有排列。def string_rank(string): string = list(string) if len(string)<1: return '' if len(string)==1: return string string_rank2(string,0)...原创 2019-08-21 20:06:00 · 99 阅读 · 0 评论 -
39-数组中出现次数超过一半的数字-python
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。def num_more_half(nums): if len(nums)<1: return None res = nums[0] cnt = 1 for num in nums: if num == res: cnt +...原创 2019-08-15 20:33:00 · 95 阅读 · 0 评论 -
40-最小的k个数-python
题目:输入n个整数,找出其中的最小的k个数。import heapqdef get_min_k(arry,k): max_heap = [] l = len(arry) if l<1 or k<1 or k>l: return None for arr in arry: arr = -1*arr ...原创 2019-08-15 21:58:00 · 81 阅读 · 0 评论 -
43-1~n整数中1出现的次数-python
题目:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。原创 2019-08-26 20:24:00 · 122 阅读 · 0 评论 -
44-数字序列中的某一位的数字-python
题目:数字以0123456789101112...的格式序列化到一个字符序列中。在这个序列中,第五位是5,第13位是1,第19位是4。求任意第n位对应的数字。def index_num(n): if n<10: return n i = 0 countDigit = 0 countInteger = 0 while cou...原创 2019-08-26 21:18:00 · 128 阅读 · 0 评论 -
45-把数组排成最小的数-python
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印拼接出所有数字汇总最小的一个。def min_arry_num(nums): res = nums_sort(nums) return ''.join(res)def nums_sort(nums): nums = [str(num) for num in nums] if len(...原创 2019-08-27 11:03:00 · 86 阅读 · 0 评论 -
46-把数字翻译成字符串-python
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,...,25翻译成“z”。一个数字可能有多个翻译。请实现一个函数,计算一个数字有多少种不同的翻译方法。def digit_to_string(num): num = str(num) length = len(num) res = [0]*length i=lengt...原创 2019-09-05 16:57:00 · 176 阅读 · 0 评论 -
48-最长不含重复字符的子字符串-python
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含‘a’~'z'的字符。def longest_without_duplication(s): max_s = '' cnt = 0 max_cnt = 0 begin,end=0,len(s)-1 while begin<=end: ...原创 2019-09-06 10:41:00 · 108 阅读 · 0 评论 -
49-丑数-python
题目:我们把只包含因子2、3和5的数称作为丑数。求按从小到大的顺序的第1500个丑数,习惯上我们把1作为第一个丑数。def ugly_num(n): if n<1: return 0 res = [0,1,2,3,4,5] i = 6 t2, t3, t5 = 1, 1, 1 while i<=n: ...原创 2019-09-09 22:51:00 · 84 阅读 · 0 评论 -
50-第一个只出现一次的字符-python
题目:字符串中第一个只出现一次的字符。def first_not_repeat(strs): dic = {} for s in strs: if s not in dic: dic[s] = 1 else: dic[s] += 1 for k,v in dic.items():...原创 2019-09-09 22:54:00 · 114 阅读 · 0 评论 -
51-数组中的逆序对-python
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对。def inverse_pairs(arrys): if len(arrys)<2: return 0 res = 0 length = len(arrys) arrys_sort =sorted(arry...原创 2019-09-10 20:05:00 · 148 阅读 · 0 评论 -
52-两个链表的第一个公共节点-python
题目:输入两个链表,找出它们的第一个公共节点。def first_common_node(head1,head2): p1,p2 = head1,head2 cnt1,cnt2=0,0 while p1: cnt1 +=1 p1=p1.next while p2: cnt2 +=1 p2=...原创 2019-09-10 20:24:00 · 83 阅读 · 0 评论 -
53-1-在排序数组中查找数字-python
题目:数字在排序数组中出现的次数。输入为一个排序数组和一个数字。def get_first_num(nums,k,start,end): if start>end: return -1 mid = (end+start)//2 if nums[mid]==k: if mid==0 or (mid>0 and nums...原创 2019-09-10 20:36:00 · 136 阅读 · 0 评论 -
53-2-0~n-1中缺失的数字-python
题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。def get_missing_num(nums): if len(nums)<1: return -1 begin,end = 0,len(nums)-1 while...原创 2019-09-10 21:02:00 · 117 阅读 · 0 评论 -
53-3-数组中数值和下标相等的元素-python
题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请找出数组中任意一个数值等于其下标的元素。def get_num_same_index(nums): if len(nums)<1: return -1 begin,end = 0,len(nums)-1 while begin<end: mid = (b...原创 2019-09-10 21:09:00 · 104 阅读 · 1 评论 -
54-二叉搜索树的第K大节点-python
题目:给定一棵二叉搜索树,请找出其中第K大的节点。def inorder(head,res): p = head if p: inorder(p.left,res) res.append(p.data) inorder(p.right,res)def tree_k(head,k): res = [] ...原创 2019-09-17 15:16:00 · 99 阅读 · 0 评论 -
55-平衡二叉树-python
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。def tree_depth(root): if not root: return 0 left = tree_depth(root.left) right = tree_depth(root.right)...原创 2019-09-17 15:57:00 · 90 阅读 · 1 评论 -
56-数组中数字出现的次数-python
题目:一个整型数组里除两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。时间复杂度O(n),空间复杂度O(1)。本题代码部分是简化版,只有一个数字出现了一次,其他都是两次。def find_appear(arrys): res = 0 for arry in arrys: res^=arry return res 注:使...原创 2019-09-17 21:53:00 · 133 阅读 · 0 评论 -
57-1和为s的数字-python
题目:输入一个递增排序的数组和一个数字s,在数组中找查找两个数,使他们的和正好为s。如果有多对,输出任意一对即可。def find_nums_sum(nums,s): begin,end=0,len(nums)-1 while begin<end: if 2*nums[begin]<s or 2*nums[end]>s: ...原创 2019-09-17 22:03:00 · 80 阅读 · 0 评论