当前位置:   article > 正文

剑指offer 解题思路简述总结篇11-20_剑指offer思路c++总结简述

剑指offer思路c++总结简述

面试题11:旋转数组的最小数字

方法:设两个指针,分别位于数组的开头和结尾,while循环,若开头的数小于结尾的数,直接返回开头数,否则找到中间的数,若中间数大于开头数,范围缩小到中间数+1到结尾数,若中间数小于开头数,则范围缩小到前半部分,若相等则直接return该段的最小值,如此反复,直到两个指针指向同一个元素元素,循环结束,返回。

  1. class Solution(object):
  2. def minArray(self, rotateArray):
  3. # write code here
  4. if len(rotateArray)==0:return 0
  5. if len(rotateArray)==1:return rotateArray[0]
  6. lengh = len(rotateArray)
  7. front = 0
  8. end = lengh-1
  9. while front!=end:
  10. if rotateArray[end]>rotateArray[front]:return rotateArray[front]
  11. mid = (front+end)//2
  12. if rotateArray[front]<rotateArray[mid]:
  13. front = mid+1
  14. elif rotateArray[front]>rotateArray[mid]:
  15. end = mid
  16. else: #110111的情况
  17. return min(rotateArray[front:end+1])
  18. return rotateArray[end]
  • 面试题12:矩阵中的路径

方法:haspath函数里挨个遍历找到和第一个数相同的起始位置,然后调用find函数遍历接下来的四个位置,并将刚才相等的位置的数置0,find中递归调用自己,return的条件是path为空

  1. class Solution:
  2. def hasPath(self, matrix, rows, cols, path):
  3. # write code here
  4. for i in range(rows):
  5. for j in range(cols):
  6. if matrix[i*cols+j]==path[0]:
  7. if self.find(list(matrix),rows,cols,path[1:],i,j):
  8. return True
  9. return False
  10. def find(self,matrix,rows,cols,path,i,j):
  11. if not path:
  12. return True
  13. matrix[i*cols+j]='0'
  14. if j+1<cols and matrix[i*cols+(j+1)]==path[0]:
  15. return self.find(matrix,rows,cols,path[1:],i,j+1)
  16. elif j-1>=0 and matrix[i*cols+(j-1)]==path[0]:
  17. return self.find(matrix,rows,cols,path[1:],i,j-1)
  18. elif i+1<rows and matrix[(i+1)*cols+j]==path[0]:
  19. return self.find(matrix,rows,cols,path[1:],i+1,j)
  20. elif i-1>=0 and matrix[(i-1)*cols+j]==path[0]:
  21. return self.find(matrix,rows,cols,path[1:],i-1,j)
  22. else:
  23. return False
  • 面试题13:机器人的运动范围

方法:block函数判断是否超过阈值,traverse函数中判断四个方向是否可行,递归调用自己,返回条件是和超过阈值或者到达了矩阵的边界,需要把经过的位置设置标记

  1. class Solution:
  2. def movingCount(self, threshold, rows, cols):
  3. # write code here
  4. board=[[0 for i in range(cols)]for j in range(rows)]
  5. global acc
  6. acc=0
  7. def block(r,c):
  8. s=sum(map(int,str(r)+str(c)))
  9. #s = r+c
  10. return s>threshold
  11. def traverse(r,c):
  12. global acc
  13. if not (0<=r<rows and 0<=c<cols):
  14. return
  15. if board[r][c]!=0:
  16. return
  17. if block(r,c):
  18. board[r][c]=-1 #超出门限的点记录-1
  19. return
  20. board[r][c]=1 #符合规定的点记录1,并计数加一
  21. acc+=1
  22. traverse(r+1,c)
  23. traverse(r-1,c)
  24. traverse(r,c+1)
  25. traverse(r,c-1)
  26. traverse(0,0)
  27. return acc
  • 面试题14:剪绳子

方法一:从下往上,动态规划,先得到f(2),f(3),再得到f(4),f(5),再f(n)

  1. class Solution(object):
  2. def cuttingRope(self, n):
  3. """
  4. :type n: int
  5. :rtype: int
  6. """
  7. if n == 2:
  8. return 1
  9. if n == 3:
  10. return 2
  11. dp = [1]*(n+1)#建立dp数组
  12. dp[1] = 1#初始化base
  13. dp[2] = 2 #2只能分成1和1,但实际上不分解更大
  14. dp[3] = 3 #3分成2和1最大,但实际上不分解最大,
  15. #进行状态转移
  16. for i in range(4,n+1):#对每个状态4~n
  17. for j in range(1,i//2+1):#对每种选择
  18. dp[i] = max(dp[i],dp[i-j]*dp[j])#状态转移方程
  19. return dp[-1]

方法二:贪婪算法,尽可能多的剪出长度为3的绳子,当剩下是4的时候,剪成2*2的绳子

  1. class Solution:
  2. def cutRope(self, number):
  3. if number < 5:
  4. return [0, 0, 1, 2, 4][number]
  5. return number % 3 * 3 ** (number // 3)
  • 面试题15:二进制中1的个数

方法一:与运算,共32与运算,每次将所给的数与1,若结果为1则count+1

方法二:把一个数减去1,再与原整数做与运算,会把该整数最右边的1变成0,所以统计可以做多少次这样的运算

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def NumberOf1(self, n):
  4. # write code here
  5. #减去1再与上原数,相当于最右边的1变成0,看能有多少次这种运算
  6. '''
  7. num = 0
  8. while n!=0:
  9. n = (n-1)&n
  10. num = num+1
  11. return num
  12. '''
  13. count = 0
  14. for i in range(32):
  15. if n&1==1:
  16. count = count+1
  17. n = n>>1
  18. return count

相关题目:

  • 面试题16:数值的整数次方

方法:很简单需要注意细节,指数是负数的时候先取正再倒数,为0的情况单独考虑

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def Power(self, base, exponent):
  4. # write code here
  5. if base ==0: return 0
  6. if exponent==0:return 1
  7. result = 1
  8. for i in range (abs(exponent)):
  9. result = result *base
  10. if exponent>0:
  11. return result
  12. else:
  13. return 1/result
  • 面试17:打印从1到最大的n位数

方法:大数问题,需要用字符串表示数字,相当于n个空位将0到9全排列,注意只保存左边起不为0的数字

  1. class Solution:
  2. def printNumbers(self, n: int) -> [int]:
  3. def dfs(x):
  4. if x == n:
  5. s = ''.join(num[self.start:])
  6. if s != '0': res.append(int(s))
  7. if n - self.start == self.nine: self.start -= 1
  8. return
  9. for i in range(10):
  10. if i == 9: self.nine += 1
  11. num[x] = str(i)
  12. dfs(x + 1)
  13. self.nine -= 1
  14. num, res = ['0'] * n, []
  15. self.nine = 0
  16. self.start = n - 1
  17. dfs(0)
  18. return res
  19. def printNumbers_2(self, n):
  20. """
  21. :type n: int
  22. :rtype: List[int]
  23. """
  24. return [i for i in range(1, 10 ** n)]
  • 面试题18:删除链表的节点

方法一:每次都比较next.val,如果相同直接将现在的指向之后的之后

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def deleteNode(self, head: ListNode, val: int) -> ListNode:
  8. # 如果头结点为空,直接返回
  9. if not head:
  10. return head
  11. # 如果头结点值等于val,直接返回head.next(题设中有注明链表中元素不重复)
  12. if head.val == val:
  13. return head.next
  14. # 定义一个指针
  15. cur = head
  16. while cur.next:
  17. # 关键步骤,如果next的值等于val,跳过该节点
  18. if cur.next.val == val:
  19. cur.next = cur.next.next
  20. break
  21. cur = cur.next
  22. return head

方法二:设置两个指针,前面那个指针比较是否相等,若果相等,直接将前面的指向后面的后面。

  1. class Solution:
  2. def deleteNode(self, head: ListNode, val: int) -> ListNode:
  3. if head.val == val: return head.next
  4. pre, cur = head, head.next
  5. while cur and cur.val != val:
  6. pre, cur = cur, cur.next
  7. if cur: pre.next = cur.next
  8. return head

方法:需要设置一个节点pre指向头节点以免头节点重复被删除,先判断是否有重复,有的话再while循环往后比较,设置pre.next = cur, cur.next=temp

  1. class Solution:
  2. def deleteDuplication(self, pHead):
  3. # write code here
  4. d = ListNode(-1)
  5. d.next = pHead
  6. pre = d
  7. cur = pHead
  8. while cur:
  9. if cur.next and cur.next.val == cur.val:
  10. temp = cur.next
  11. while temp and temp.val == cur.val:
  12. temp = temp.next
  13. pre.next = temp
  14. cur = temp
  15. else:
  16. pre = cur
  17. cur = cur.next
  18. return d.next

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43682
推荐阅读
相关标签
  

闽ICP备14008679号