剑指offer解题思路简述 41-50

  • 面试题41:数据流中的中位数

方法1:没有排序的数组,插入1,得到中位数n

方法2:排序的数组,插入n,得到中位数1

方法3:排序的链表,同排序的数组

方法4:最大堆+最小堆,插入logn,得到中位数1,保证建立的最大堆的每个数都小于最小堆,为保证两个堆平衡,约定当前数目为奇数时放到最大堆,如果当前数大于最小堆的最小数x,则将x放入最大堆,将当前数放入最小堆。

  • 面试题42:连续子数组的最大和

方法:当前累加的和若为负数,直接舍弃,保存当前的最大和,从下一个数重新开始累加

  • 面试题43:1~n整数中1出现的次数

方法:有点绕

  • 面试题44:数字序列中某一位的数字

方法:确定是几位数

  • 面试题45:把数组排成最小的数

方法一:求全排列,然后比较大小

方法二:

sorted(ss, key=functools.cmp_to_key(lambda a,b: int(str(a)+str(b))-int(str(b)+str(a))), reverse=True)
  • 面试题46:把数字翻译成字符串

方法:从后往前,相当于斐波拉契数列,只不过这里面多了一个条件,只有当10*s[-1-i]+s[-i]需要在小于25,f(n)=f(n-1)+f(n-2),如果大于的话f(n)=f(n-1)

  • 面试题47:礼物的最大价值

方法:两层for循环,当第一行或者第一列的时候,只用当前值加上该行或者该列的上一个值就可以,其他的情况需要加上一行和上一列的最大值。优化的方法:在原数组上操作,不需要新建一个空间。

  • 面试题48:最长不含重复字符的子字符串

方法:遍历字符串,建一个等长的数组保存当前位置的最大字符串数,建一个list保存当前状态下前面不重复的字符串,每次遍历都更新,如果新来的字符没有重复,则直接加一,有重复的话找到在list中的位置,切片获取它后面的部分,然后更新

  • 面试题49:丑数

方法:思路就是用2,3,5分别乘以找到的丑数,并且整个过程按照大小顺序排列。[1,2,3,....]设置三个初始值为0的数分别标记当前2,3,5乘到了结果list的第几位,如先比较1*2,1*3,1*5,明显2小,所以把2 append进list里,然后把2的标志位加1,下次2就需要乘2,再和其他比较。

  • 面试题50:第一个只出现一次的字符

方法1:创建一个哈希表,字符作为key,次数作为value,字符的种类一共有256个,所以空间复杂度为1。扫描两次字符串,第一次记录每个字符串出现的次数,第二次从前遍历,找到value值第一次出现为1的key,时间复杂度为n

方法2:利用python自带的函数,for index, value in enumerate(s): if s.count(value) == 1:return 

方法:设置一个字典存放字符和次数,设置一个list存放当前出现过的字符,每次for list,找到第一个value值为1的key,直接返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章