- 面试题11:旋转数组的最小数字
方法:设两个指针,分别位于数组的开头和结尾,若开头的数小于结尾的数,直接返回开头数,否则找到中间的数,若中间数大于开头数,范围缩小到中间数到结尾数,若中间数小于开头数,则范围缩小到前半部分,若相等则直接return该段的最小值,如此反复,直到两个指针指向两个相邻的元素,循环结束,返回第二个指针指向的元素。
- 面试题12:矩阵中的路径
方法:回朔法,
- 面试题13:机器人的运动范围
方法:回朔法
- 面试题14:剪绳子
方法一:从下往上递归,先得到f(2),f(3),再得到f(4),f(5),再f(n)
方法二:贪婪算法,尽可能多的剪出长度为3的绳子,当剩下事4的时候,剪成2*2的绳子
- 面试题15:二进制中1的个数
方法一:与运算,先用1与上给定的数字,然后1左移,问题是需要而且确定要移几次
方法二:把一个数减去1,再与原整数做与运算,会把该整数最右边的1变成0,所以统计可以做多少次这样的运算
相关题目:
- 面试题16:数值的整数次方
方法:很简单需要注意细节,指数是负数的时候先取证再倒数,为0的情况单独考虑
- 面试17:打印从1到最大的n位数
方法:大数问题,需要用字符串表示数字,相当于n个空位将0到9全排列
- 面试题18:删除链表的节点
方法一:找到要删除节点的前节点,指向要删节点的下个节点,n
方法二:将要删节点的下个节点的内容复制到要删节点的位置,将要删节点的指针指向下下个节点
都要考虑要删除的节点是尾节点以及头节点的情况
- 面试题19:正则表达式匹配
方法:情况过于复杂,分情况讨论,用到了递归
- 面试题20:表示数值的字符串
方法:
return
re.match(r
"^[\+|\-]?[0-9]*(\.[0-9]*)?([e|E][\+\-]?[0-9]+)?$"
,s)