斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,n<=39)。

循环实现,时间复杂度n

  1. def Fibonacci(self, n):
  2. if n == 0:
  3. return 0
  4. if n == 1:
  5. return 1
  6. a = 1
  7. b = 0
  8. ret = 0
  9. for i in range(0, n-1): #[0,n-1)
  10. ret = a + b
  11. b = a
  12. a = ret
  13. return ret

递归实现,时间复杂度2^n

  1. def Fibonacci(self, n):
  2. if n == 0:
  3. return 0
  4. if n == 1:
  5. return 1
  6. if n > 1
  7. num = self.Fibonacci(n-1) + self.Fibonacci(n-2)
  8. return num

跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

a.假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1)

b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)

c.由a和b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)

d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1,只有两阶的时候可以有 f(2) = 2

e.可以发现最终得出的是一个斐波那契数列

  1. def jumpFloor(self, number):
  2. # write code here
  3. if number == 1:
  4. return 1
  5. a = 1
  6. b = 1
  7. for i in range(1, number):
  8. ret = a + b
  9. b = a
  10. a = ret
  11. return ret

变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路1: 每个台阶可以看作一块木板,让青蛙跳上去,n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有存在和不存在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果


思路2: 因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级

跳1级,剩下n-1级,则剩下跳法是f(n-1)

跳2级,剩下n-2级,则剩下跳法是f(n-2)

跳n级,剩下n-2级,则剩下跳法是f(0)

所以f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)

因为f(n-1)=f(n-2)+f(n-3)+...+f(1)+f(0)

所以f(n)=2*f(n-1)

  1. def jumpFloorII(self, number):
  2. # write code here
  3. return pow(2,number-1)

二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

从右上角的数开始找:

大于则向下,第一行的数无需对比

小于则向左,最后一列的数无需对比

  1. def Find(self, target, array):
  2. # write code here
  3. rows = len(array)
  4. cols = len(array[0])
  5. if rows >0 and cols >0:
  6. i=0
  7. j= cols - 1
  8. while i < rows and j >= 0:
  9. value = array[i][j]
  10. if value == target:
  11. return True
  12. elif value > target:
  13. j -= 1
  14. else:
  15. i += 1
  16. return False

替换空格

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. # s 源字符串
  4. def replaceSpace(self, s):
  5. # write code here
  6. #方法一 一次遍历 时间 O(n) 空间O(n)
  7. result = ''
  8. for i in s:
  9. if i == ' ':
  10. result += '%20'
  11. else:
  12. result += i
  13. return result
  14. # 方法二 使用内置函数
  15. return s.replace(' ','%20')

用两个栈实现队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

第一个栈临时保存插入的数据,当调用弹出函数的时候,如果stack2不为空则直接弹出;为空则把stack1中的数据全部弹出放到stack2中。这样不会存在冲突,而且由于stack2保存的是以前的老数据,弹出一定都符合队列的规律

  1. class Solution:
  2. def __init__(self):
  3. self.stack1 = []
  4. self.stack2 = []
  5. def push(self, node):
  6. self.stack1.append(node)
  7. def pop(self):
  8. if self.stack2:
  9. return self.stack2.pop()
  10. else:
  11. while self.stack1:
  12. self.stack2.append(self.stack1.pop())
  13. return self.stack2.pop()

旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

旋转后的数组先递增,然后突然断层,让后又递增,所以,只要找到数组突然变小的那个数字即可。

二分查找法:如果中间点大于首元素,说明最小数字在后面一半,如果中间点小于尾元素,说明最小数字在前一半。依次循环。同时,当一次循环中首元素小于尾元素,说明最小值就是首元素。

但是当首元素等于尾元素等于中间值,只能在这个区域顺序查找。

  1. class Solution:
  2. def minNumberInRotateArray(self, rotateArray):
  3. # 优化后的遍历
  4. if rotateArray is None:
  5. return None
  6. temp = rotateArray[0]
  7. for i in range(len(rotateArray) - 1):
  8. if rotateArray[i] > rotateArray[i+1]:
  9. temp = rotateArray[i+1]
  10. break
  11. return temp
  12. # binarySearch O(lg(n))
  13. if not rotateArray:
  14. return 0
  15. left = 0
  16. right = len(rotateArray) - 1
  17. while left <= right:
  18. mid = (left + right) >> 1 # (left +right)/2
  19. if rotateArray[mid] < rotateArray[mid-1]:
  20. return rotateArray[mid]
  21. elif rotateArray[mid] < rotateArray[right]:
  22. right = mid - 1
  23. else:
  24. left = mid + 1
  25. return 0

调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

数组里的任意相邻两个数必须是{奇数,偶数}的形式,任何出现{偶数,奇数}的形式,都要把两个数交换位置。套用冒泡排序的思想,只需要将原来冒泡排序的判断条件从比较两个数的大小改为判断相邻两个数是否为{奇数,偶数}的形式即可。

  1. def reOrderArray(self, array):
  2. # 时间复杂度O(n),空间复杂度O(n)
  3. ret = []
  4. for i in array:
  5. if i % 2 == 1:
  6. ret.append(i)
  7. for i in array:
  8. if i % 2 == 0:
  9. ret.append(i)
  10. return ret
  11. # 简化代码
  12. odd,even = [],[]
  13. for i in array:
  14. odd.append(i) if i % 2 == 1 else even.append(i)
  15. return odd + even
  16. # 冒泡排序法,时间复杂度O(n^2)
  17. arrayLen = len(array)
  18. for i in range(arrayLen):
  19. for j in range(arrayLen - i - 1):
  20. if array[j] % 2 == 0 and array[j + 1] % 2 == 1:
  21. array[j + 1],array[j] = array[j],array[j + 1]
  22. return array

包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

  1. def __init__(self):
  2. self.stack = []
  3. self.min_stack = []
  4. def push(self, node):
  5. self.stack.append(node)
  6. #如果min_stack为空,或者当前结点值小于等于栈最后的那个值
  7. if not self.min_stack or node <= self.min_stack[-1]:
  8. self.min_stack.append(node)
  9. def pop(self):
  10. if self.stack[-1] == self.min_stack[-1]:
  11. self.min_stack.pop()
  12. self.stack.pop()
  13. def top(self):
  14. return self.stack[-1]
  15. def min(self):
  16. return self.min_stack[-1]

栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

pushV压入栈,循环判断压入栈的顶部和当前弹出栈的顶部数据是否相等,相等则弹出,最终栈为空代表序列正确

  1. def IsPopOrder(self, pushV, popV):
  2. # write code here
  3. if pushV == [] or len(pushV) != len(popV):
  4. return None
  5. stack,index = [],0
  6. for item in pushV:
  7. stack.append(item)
  8. while stack and stack[-1] == popV[index]:
  9. stack.pop()
  10. index += 1
  11. '''
  12. if stack == []:
  13. return True
  14. else:
  15. return False
  16. '''
  17. return True if stack == [] else False

牛客网剑指offer【Python实现】——part1的更多相关文章

  1. 数组中只出现过一次的数字 牛客网 剑指Offer

    数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...

  2. 数组中出现次数超过一半的数字 牛客网 剑指Offer

    数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...

  3. 数据流中的中位数 牛客网 剑指Offer

    数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...

  4. 数字在排序数组中出现的次数 牛客网 剑指Offer

    数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...

  5. 数值的整数次方 牛客网 剑指Offer

    数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...

  6. 按之字形顺序打印二叉树 牛客网 剑指Offer

    按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...

  7. 把数组排成最小的数 牛客网 剑指Offer

    把数组排成最小的数 牛客网 剑指Offer 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能 ...

  8. 把字符串转换成整数 牛客网 剑指Offer

    把字符串转换成整数 牛客网 剑指Offer 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串 ...

  9. 把二叉树打印成多行 牛客网 剑指Offer

    把二叉树打印成多行 牛客网 剑指Offer 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行 # class TreeNode: # def __init__(self, x) ...

  10. 栈的压入、弹出顺序 牛客网 剑指Offer

    栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...

随机推荐

  1. 杂记:VMware中为mac虚拟机扩容

    之前在VMware中安装Mac虚拟机时,硬盘选的是默认的40G,后来用的过程中随着软件的安装,特别是安装完Xcode和QT5.9之后,可用空间只剩不到3G,每次开机之后都会提醒空间不足,需要清理空间, ...

  2. Python-rediscluster客户端

    # -*- coding: UTF-8 -*- import redis import sys from rediscluster import StrictRedisCluster #host = ...

  3. Daily Practice 2016-09-20

    算法 回文(Palindrome)数字:判断一个数字是不是回文数字,不能使用另外的空间. 提示: 负数可以是回文数字吗? 如果转为字符串需要新分配空间 你也许想到了反转数字,但反转数字可能溢出,怎样处 ...

  4. sycPHPCMS v1.6 cookie sqlinjection

    ./user/index.php include "../include/conn.php"; include "../include/function.php" ...

  5. brup安装证书抓取https

    brup安装证书抓取https 0x00下载 下载安装brup 前提是需要java环境 0X01配置brup 配置brup的代理设置 0X02设置浏览器 我使用的是火狐,以下都以火狐为例 0X03证书 ...

  6. C++走向远洋——56(项目二1、动物这样叫、虚函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. C++走向远洋——51(数组类运算的实现)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. 解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题

    用Hexo搭了个Gitpage的博客,兴冲冲的发了11篇博文后发现翻页按钮不正常显示,显示为<i class="fa fa-angle-right"></i> ...

  9. Java 抽象类 抽象方法 使用说明

    知识点 什么是抽象类 抽象类与普通类主要两点不同: 1.在类的修饰符后面多了一个abstract关键字 2.抽象类是不允许通过new来实例化的 由于抽象类不能通过new来实例化,所以基本上是在继承中当 ...

  10. python使用for循环打印9*9乘法表。

    代码如下: for a in range(1, 10): for b in range(1, 10): if b <= a: print("%d*%d=%d\t" % (b, ...