1. 今天主要写了一下offer 1-41题,余下的稍后整理
    1 """
  2. 1 镜像二叉树: 递归
  3. """
  4. def mirror(root):
  5. if not root:
  6. return None
  7. mirror(root.left)
  8. mirror(root.right)
  9. root.left, root.right = root.right, root.left
  10. return root
  11.  
  12. """2. 链表环入口
  13. """
  14. def circle(node):
  15. if not node:
  16. return None
  17. slow,fast = node, node
  18. while fast and fast.next:
  19. slow = slow.next
  20. fast = fast.next.next
  21. if slow == fast:
  22. slow = node
  23. while slow != fast:
  24. slow = slow.next
  25. fast = fast.next
  26. return fast
  27. return None
  28.  
  29. """
  30. 3 删除重复结点
  31. """
  32. def delNode(pHead):
  33. first = ListNode(-1)
  34. cur = pHead
  35. last = first
  36. while cur and cur.next:
  37. if cur.val != cur.next.val:
  38. cur = cur.next
  39. last = last.next
  40. else:
  41. val = cur.val
  42. while cur and cur.val == val:
  43. cur = cur.next
  44. last.next = cur
  45. return first.next
  46.  
  47. """4 打印链表"""
  48.  
  49. def info(pHead):
  50. res = []
  51. if not pHead:
  52. return None
  53. while pHead:
  54. res.index(pHead.val)
  55. pHead = pHead.next
  56. return res
  57.  
  58. """5 斐波那契数列的第n项"""
  59.  
  60. def Fib(n):
  61. dp = [0,1]
  62. if n == 0:
  63. return 0
  64. if n == 1:
  65. return 1
  66. for i in range(2, n+1):
  67. dp.append(dp[i-1] + dp[i-2])
  68. return dp[-1]
  69.  
  70. def Fib1(n):
  71. if n == 0:
  72. return 0
  73. if n == 1:
  74. return 1
  75. a ,b = 0, 1
  76. while n-1:
  77. temp = a
  78. a = b
  79. b = temp + b
  80. n -= 1
  81. return b
  82.  
  83. """6 变态跳台阶"""
  84. def jump(n):
  85. if n == 1:
  86. return 1
  87. dp = [1]
  88. for i in range(1, n):
  89. dp[i] = sum(dp[:i]) + 1
  90. return dp[-1]
  91.  
  92. def jumpFloorII(number):
  93. # write code here
  94. if number == 1:
  95. return 1
  96. dp = [1] * (number)
  97. dp[0], dp[1] = 1, 2
  98. for i in range(2, number):
  99. dp[i] = 2 * dp[i - 1]
  100. return dp[-1]
  101.  
  102. """10 平衡二叉树"""
  103.  
  104. def isBalance(root):
  105.  
  106. def deep(root):
  107. if not root:
  108. return 0
  109. left = deep(root.left)
  110. right = deep(root.right)
  111. return max(left, right) + 1
  112. if not root:
  113. return True
  114. return abs(deep(root.left) - deep(root.right)) <=1
  115.  
  116. """11.和为s的连续数字"""
  117.  
  118. def findNumber(tsum):
  119. res = []
  120. left, right = 1, 2
  121. if tsum < 3:
  122. return []
  123. while left< right and left < tsum//2+1:
  124. if sum(range(left, right+1)) == tsum:
  125. res.append(range(left, right+1))
  126. left += 1
  127. elif sum(range(left, right+1)) < tsum:
  128. right +=1
  129. else:
  130. left+=1
  131. return res
  132.  
  133. """12 左旋字符串"""
  134. def left(s, k):
  135. if s == "":
  136. return ""
  137. k = k%len(s)
  138. return s[k:] + s[:k]
  139.  
  140. """13 数字在排序数组出现次数"""
  141.  
  142. def numberCount(data, k):
  143. if not data:
  144. return 0
  145. left, right = 0, len(data) - 1
  146. while left <= right:
  147. mid = (left + right) // 2
  148. if data[mid] == k:
  149. index = mid
  150. res = 0
  151. while index < len(data) and data[index] == k:
  152. res += 1
  153. index += 1
  154. index = mid - 1
  155. while index >= 0 and data[index] == k:
  156. res += 1
  157. index -= 1
  158. return res
  159. elif data[mid] > k:
  160. right = mid - 1
  161. else:
  162. left = mid + 1
  163. return 0
  164.  
  165. """14 数组只出现一次的数字 : 异或运算"""
  166.  
  167. def onlyOne(array):
  168. temp = 0
  169. flag = 1
  170. a,b = 0,0
  171. for i in array:
  172. temp = temp ^ i
  173. while temp:
  174. if temp % 2 != 0:
  175. break
  176. temp >> 1
  177. flag = flag << 1
  178. for i in array:
  179. if i&flag:
  180. a =a^i
  181. else:
  182. b = b^i
  183. return a,b
  184.  
  185. """16 二叉树深度 : 参照10"""
  186.  
  187. """17 和为s的两个数: 双指针:距离最远的数字最小"""
  188. def FindNumbersWithSum( array, tsum):
  189. left, right = 0, len(array)-1
  190. a,b = 0,0
  191. while left<= right:
  192. if array[left] + array[right] == tsum:
  193. return array[left],array[right]
  194.  
  195. elif array[left] + array[right] < tsum:
  196. left +=1
  197. else:
  198. right -=1
  199. return []
  200.  
  201. """18 顺时针打印矩阵 : 思路:每次打印第一行,将矩阵逆时针旋转90 直到为None"""
  202.  
  203. def infoArray(matrix):
  204. if not matrix:
  205. return None
  206. res = []
  207. while matrix:
  208. res = res + matrix[0]
  209. matrix.pop(0)
  210. matrix = list(map(list, zip(*matrix)))[::-1]
  211. return res
  212.  
  213. """19 二叉树的下一个结点(***)中序遍历(左 中 右)
  214. ① 如果结点存在右结点,则进入右子树(最左边的结点) 该节点相当于根
  215. ② 若该节点无右子节点,且该节点为父亲的左子节点,则为父节点 该节点为左节点
  216. ③ 若该节点无右子节点,且该节点为父亲的右子节点,则需要一直搜索父亲,直到为某个结点的左节点
  217.  
  218. """
  219. def nextNode(pNode):
  220. if not pNode:
  221. return None
  222. if pNode.right: #情况1
  223. temp = pNode.right
  224. while temp.left:
  225. temp = temp.left
  226. return temp
  227.  
  228. else:
  229. temp = pNode.next #temp指向父亲
  230. while temp and temp.right == pNode: #判断是否为父亲的右节点, 不是的话退出 返回上一行的值
  231. #是的话执行情况3
  232. pNode = temp
  233. temp = temp.next
  234. return temp
  235.  
  236. """20 对称二叉树"""
  237.  
  238. def symme(left, right):
  239. if not left and not right:
  240. return True
  241. if left and right:
  242. return left.val == right.val and symme(left.left, right.right) and symme(left.right, right.left)
  243. else:
  244. return False
  245. def issymme(pRoot):
  246. if not pRoot:
  247. return True
  248. return symme(pRoot.left, pRoot.right)
  249.  
  250. """21 二叉树打印多行 从左往右打印"""
  251. """层次遍历二叉树(补充)"""
  252. def cengci(root):
  253. if not root:
  254. return None
  255. queue = [root]
  256. res = []
  257. while queue:
  258. res.append(queue[0].val)
  259. if queue[0].left:
  260. queue.append(queue[0].left)
  261. if queue[0].right:
  262. queue.append(queue[0].right)
  263. queue.pop(0)
  264. return res
  265.  
  266. """本题"""
  267. def print(pRoot):
  268. if not pRoot:
  269. return []
  270. res = []
  271. queue = [pRoot]
  272. while queue:
  273. temp = []; queue_temp = []
  274. for i in queue:
  275. temp.append(i.val)
  276. if i.left:
  277. queue_temp.append(i.left)
  278. if i.right:
  279. queue_temp.append(i.right)
  280. queue = queue_temp
  281. res.append(temp)
  282. return res
  283. """24 数据流中位数 : 大根堆 和小根堆"""
  284.  
  285. """26 重建二叉树 先序 中序"""
  286. def buildTree(pre, tin):
  287. root = pre[0]
  288. index = tin.index(root)
  289. ltin = tin[:index]
  290. rtin = tin[index+1:]
  291. lpre = pre[1:len(ltin)+1]
  292. rpre = pre[1+len(ltin):]
  293. p = TreeNode(root)
  294. p.left = buildTree(lpre,ltin)
  295. p.right = buildTree(rpre,rtin)
  296. return p
  297.  
  298. """27 滑动窗口最大"""
  299.  
  300. """28 栈实现队列: 根据性质"""
  301.  
  302. """29 旋转数组最小值:二分查找"""
  303. def minNumber(rotateArray):
  304. if not rotateArray:
  305. return None
  306. low,high = 0, len(rotateArray)-1
  307. while low < high:
  308. mid = (low + high) //2
  309. if rotateArray[mid] > rotateArray[high]:
  310. left = mid + 1
  311. else:
  312. high = mid
  313. return rotateArray[left]
  314.  
  315. """30 丑数"""
  316. def ugly(index):
  317. if index ==0:
  318. return 0
  319. if index == 1:
  320. return 1
  321. dp = [1]
  322. n1,n2,n3 = 0,0,0
  323. for i in range(index-1):
  324. num1,num2,num3 = dp[n1]*2, dp[n2]*3, dp[n3]*5
  325. Min = min(num1, num2,num3)
  326. dp.append(Min)
  327. if num1 == Min:
  328. n1 += 1
  329. if num2 == Min:
  330. n2 += 1
  331. if num3 == Min:
  332. n3 += 1
  333. return dp[-1]
  334.  
  335. """31 链表的第一个公共结点"""
  336. def firstCommonNode(pHead1, pHead2):
  337. if not pHead1 or not pHead2:
  338. return None
  339. p1,p2 = pHead1,pHead2
  340. while p1 != p2:
  341. if p1:
  342. p1 = p1.next
  343. else:
  344. p1 = pHead2
  345. if p2:
  346. p2 = p2.next
  347. else:
  348. p2 = pHead1
  349. return p1
  350.  
  351. """32 第一次只出现一次的字符
  352. queue 存储每个字符第一次出现的位置
  353. """
  354. def firstChar(s):
  355. dict = {}
  356. queue = []
  357. for i in range(len(s)):
  358. if s[i] not in dict:
  359. dict[s[i]] = 1
  360. queue.append(i)
  361. else:
  362. dict[s[i]] += 1
  363. for i in queue:
  364. if dict[s[i]] == 1:
  365. return i
  366. return -1
  367.  
  368. """33 数组中逆序对
  369. 思路: 先排序 从小到大找 对应 原数组中去
  370. 例[2,5,1] -> [1,2,5] 从1开始在原数组找它的索引就是它对应的逆序对数 1:2 2:1 5:0
  371. """
  372. def inverse(data):
  373. temp =[]
  374. res = 0
  375. for i in data:
  376. temp.append(i)
  377. temp = sorted(temp)
  378. for i in temp:
  379. res += data.index(i)
  380. data.remove(i)
  381. return res
  382.  
  383. """34 连续数组的最大和"""
  384. def FindGreatestSumOfSubArray(array):
  385. # write code here
  386. for i in range(1, len(array)):
  387. if array[i - 1] >= 0:
  388. array[i] = array[i] + array[i - 1]
  389. else:
  390. continue
  391. return max(array)
  392.  
  393. """35 最小的k个数
  394. TOPK问题: 一般建立大根堆, 如果是最大的就建立小根堆
  395. 快排也可以实现
  396. """
  397. # 快排
  398. def p( L, l, r):
  399. temp, i = L[r], l - 1
  400. for j in range(l, r):
  401. if L[j] <= temp:
  402. i += 1
  403. L[i], L[j] = L[j], L[i]
  404. L[i + 1], L[r] = L[r], L[i + 1]
  405. return i + 1
  406.  
  407. def GetLeastNumbers_Solution( tinput, k):
  408. if k == 0 or k > len(tinput):
  409. return []
  410. else:
  411. flag = p(tinput, 0, len(tinput) - 1) #拆分点
  412. while flag != k - 1:
  413. if flag > k - 1:
  414. flag = p(tinput, 0, flag - 1)
  415. if flag < k - 1:
  416. flag = p(tinput, flag + 1, len(tinput) - 1)
  417. return sorted(tinput[:flag + 1])
  418. #堆排序(TOP) 这是找最大的。
  419. class Solution:
  420. def __init__(self):
  421. pass
  422. def Heap(self, L, i, size): #小根堆维护
  423. root = i
  424. left , right = 2*i+1, 2*i+2
  425. if left < size and L[root]> L[left]:
  426. root = left
  427. if right < size and L[root]> L[right]:
  428. root = right
  429. if root != i:
  430. L[root],L[i] = L[i],L[root]
  431. self.Heap(L,root,size)
  432. return L
  433. def buildHeap(self, L):
  434. for i in range(len(L)//2,-1,-1):
  435. self.Heap(L,i,len(L))
  436. return L
  437. def TopK(self, L, k):
  438. result = L[:k]
  439. result = self.buildHeap(result)
  440. for i in range(k,len(L)):
  441. if L[i] > result[0]:
  442. result[0] = L[i]
  443. self.Heap(result, 0, k)
  444. return result
  445. """"""
  446.  
  447. """36 数组超过一半的数
  448. 排序(多余一半的肯定出现在中间)"""
  449. def MoreNum(numbers):
  450. numbers = sorted(numbers)
  451. key = numbers[len(numbers) // 2]
  452. if numbers.count(key) > len(numbers) // 2:
  453. return key
  454. else:
  455. return 0
  456.  
  457. """37 1 到n中 1出现的次数
  458. 找规律
  459. """
  460. """38 数组排成最小的数"""
  461. def minNum(numbers):
  462. if numbers is None or len(numbers) == 0:
  463. return ""
  464. numbers = map(str, numbers)
  465. numbers.sort(cmp=lambda x, y: cmp(x + y, y + x))
  466. return "".join(numbers).lstrip()
  467.  
  468. #错误
  469. def minNum2(numbers):
  470. numbers = sorted(list(map(str, numbers)))
  471. res = ""
  472. for i in numbers:
  473. print(i)
  474. if (res + i) >= (i + res):
  475. res = i+res
  476. else:
  477. res = res+i
  478.  
  479. return res
  480.  
  481. """39 数组中重复的数字"""
  482. def duplicate(numbers, duplication):
  483. # write code here
  484. dict = {}
  485. for i in range(len(numbers)):
  486. if numbers[i] not in dict:
  487. dict[numbers[i]] = 1
  488. else:
  489. dict[numbers[i]] += 1
  490. for i in dict:
  491. if dict[i] > 1:
  492. duplication[0] = i
  493. return True
  494. duplication[0] = -1
  495. return False
  496.  
  497. """40 构造乘积数组
  498. 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],
  499. 其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。
  500. """
  501. def mulMatrix(A):
  502. size = len(A)
  503. B = [1] * size
  504. for i in range(1, size): # 构建下三角矩阵(上 到 下)
  505. B[i] = A[i - 1] * B[i - 1]
  506. temp = 1
  507. for i in range(size - 2, -1, -1):
  508. temp = temp * A[i + 1]
  509. B[i] = B[i] * temp
  510. return B
  511.  
  512. """?? 旋转数组的查找:二分查找"""
  513. def findKey(target, array):
  514. if not array:
  515. return None
  516. left, right = 0,len(array)-1
  517. while left < right:
  518. mid = (left + right)//2
  519. if array[mid] == target:
  520. return True
  521. if array[mid] < array[right]: #右侧有序
  522. if target > array[mid] and target <= array[right]:
  523. left = mid + 1
  524. else:
  525. right = mid -1
  526. else:
  527. if target >= array[left] and target < array[mid]:
  528. right = mid -1
  529. else:
  530. left = mid + 1
  531. return False
  532.  
  533. """41 二维数组的查找"""
  534. def findkey(target, array):
  535. if not array:
  536. return False
  537. row ,col = 0, len(array[0])-1
  538. while row <= len(array) and col>=0:
  539. if array[row][col] == target:
  540. return True
  541. elif array[row][col] > target:
  542. col -= 1
  543. else:
  544. row += 1
  545. return False

剑指Offer 1-41 代码(python实现)的更多相关文章

  1. 剑指offer 面试41题

    面试41题: 题目:数据流中的中位数 题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值 ...

  2. 剑指offer(41)和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  3. 【剑指Offer】41、和为S的连续正数序列

      题目描述:   小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数). ...

  4. 剑指offer 面试35题

    面试35题: 题目:复杂链表的复制 题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中 ...

  5. 剑指offer 面试56题

    面试56题: 题目:数组中数字出现的次数 题:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 解题思路: 方法一:异或运算,详见<剑指offer&g ...

  6. 【剑指Offer】剑指offer题目汇总

      本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...

  7. 【剑指offer】翻转单词顺序

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27372033 题目描写叙述: JOBDU近期来了一个新员工Fish,每天早晨总是会拿着一本 ...

  8. 剑指offer——27. 二叉搜索树与双向链表(Java版)

    题目: 剑指offer的题目有挺多都挺典型的,就像这一道.不过书中的代码写的真是ugly,有很多题目LeetCode上都有,可以去LeetCode讨论区看看,经常有一些大神分享,写的代码真是高效.简洁 ...

  9. 剑指offer 面试11题

    面试11题: 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4 ...

  10. 剑指offer 面试14题

    面试14题: 题目:剪绳子 题:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,且n>1,m>1),每段绳子的长度记为k[0],k[1],k[2],...,k[m].请问k[0] ...

随机推荐

  1. Oracle DBCA工具检测不到ASM磁盘组

    本例环境: 操作系统OEL 6.5 数据库版本:11.2.0.4 问题:DBCA建库的时候,检测不到ASM磁盘组 因素一:可能是在授权的时候执行了 chown –R 775 /u01/app等修改权限 ...

  2. From 7.22 To 7.28

    From 7.22 To 7.28 大纲 竞赛 我们好像要跟队爷考试... 考试的时候做题吧 学科 还是跟之前一样吧, 完型和阅读几乎没做过... 运动 踢足球!!!!!! 可惜bb他们去上海了... ...

  3. Windows下设置U盘自动复制文件到本地

    一.打开记事本,把下面的代码复制进去 set fso=createobject("scripting.filesystemobject") set ws=createobject( ...

  4. Python 读文件:IOError: [Errno 0] Error

    Windows系统下,这种情况发生在读取文件,再写入过程中出现. 原因是读完文件后python不知道当前文件位置在哪里. 方法一是:在关闭文件前只做读或者写一种操作. 方法二是:在写入文件前使用fil ...

  5. PHP 验证5-20位数字加字母的正则(数字和字母缺一不可)!!!

    $pattern = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,20}$/'; if(!preg_match($pattern,$username)){ re ...

  6. 黑马lavarel教程---5、模型操作(AR模式)

    黑马lavarel教程---5.模型操作(AR模式) 一.总结 一句话总结: AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型 ...

  7. ftp相关

    已经存在虚拟账户 添加新账户 .在/etc/vsftpd/user.txt里面配置用户名密码 单行是用户名 双行是密码 .导入新用户密码 db_load -T -t hash -f /etc/vsft ...

  8. selenium爬虫使用

    1. 网页的打开 from selenium import webdriver import time driver = webdriver.Chrome(executable_path=r" ...

  9. 代码实现:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名

    package com.loaderman.test; import java.io.File; import java.io.FileReader; import java.util.Scanner ...

  10. 数据库报错:OracleDialect does not support identity key generation

    当我把数据库改为oracle时,项目报错:org.hibernate.MappingException: org.hibernate.dialect.OracleDialect does not su ...