数组题汇总(python3)
题目主要来自《剑指offer》和LeetCode,用python3来写的代码。
1、二维数组的查找:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
# -*- coding:utf-8 -*-
class Solution: def Find(self, target, array):
rows = len(array)-1
cols = len(array[0])-1
i = rows
j = 0
while i >= 0 and j <= cols:
if target < array[i][j]:
i -= 1
elif target > array[i][j]:
j += 1
else:
return True
return False
2、旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
lens = len(rotateArray)
if lens == 0:
return 0
elif lens == 1:
return rotateArray[0]
else:
left = 0
right = lens-1
while left < right:
mid = (left+right)//2
if rotateArray[mid] <= rotateArray[right]:
right = mid
else:
left = mid+1
return rotateArray[right]
3、斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
# -*- coding:utf-8 -*-
class Solution: def Fibonacci(self, n):
fib = [0,1]
if n <= 1:
return fib[n] while len(fib)<=n:
fib.append(fib[-1]+fib[-2])
return fib[n]
4、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
# -*- coding:utf-8 -*-
class Solution: def jumpFloor(self, number):
ways = [1,2]
if number <= 2:
return ways[number-1] while len(ways)<=number:
ways.append(ways[-1]+ways[-2])
return ways[number-1]
5、变态跳台阶
这道题纯粹是为了和前一题对比,放在数组这篇博客里。一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
if number <=1:
return number
else:
way = 1
for i in range(2,number+1):
way *= 2
return way
6、矩形覆盖
和斐波那契数列的思路差不多。我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
ways = [0,1,2]
if number <= 2:
return ways[number]
else:
while len(ways) <= number:
ways.append(ways[-1]+ways[-2])
return ways[number]
7、数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
temp = 1
if base == 0:
return 0
elif base != 0 and exponent == 0:
return 1
elif base!= 0 and exponent > 0:
for i in range(exponent):
temp *= base
return temp
else:
for i in range(-exponent):
temp *= 1./ base
return temp
8、调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
if not array:
return []
odd_list = []
even_list = []
for i in array:
if i % 2 != 0:
odd_list.append(i)
else:
even_list.append(i)
return odd_list+even_list
9、顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
# -*- coding:utf-8 -*-
class Solution:
def printMatrix(self, matrix):
res = []
while matrix:
res += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
res.append(row.pop())
if matrix:
res += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
res.append(row.pop(0))
return res
10、数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
if not numbers:
return 0
lens = len(numbers)
count_freq = {}
for i in numbers:
if i not in count_freq:
count_freq[i] = 1
else:
count_freq[i] += 1
for key,value in count_freq.items():
if value > (lens//2):
return key
return 0
11、连续子数组的最大和
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。
借鉴自然语言处理中的ngram的做法。
# -*- coding:utf-8 -*-
class Solution:
def FindGreatestSumOfSubArray(self, array): def get_ngram(array):
n = len(array)
m = 1
n_gram = [array[i-k:i] for k in range(m,n+1) for i in range(k,n+1)]
return n_gram def find_max(array):
n_gram = get_ngram(array)
sum_n_gram = [sum(i) for i in n_gram]
max_sum = sum_n_gram[0]
for i in sum_n_gram:
if i >= max_sum:
max_sum = i
return max_sum if not array:
return
else:
return find_max(array)
12、把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
这个题在python3环境下,要调用一个函数cmp_to_key。
# -*- coding:utf-8 -*-
from functools import cmp_to_key
class Solution:
def PrintMinNumber(self, numbers):
if not numbers:
return ''
def compare(a,b):
if a+b > b+a:
return 1
elif a+b < b+a:
return -1
else:
return 0
numbers = [str(i) for i in numbers]
numbers.sort(key=cmp_to_key(compare))
return ''.join(numbers).lstrip('')
13、丑数
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
这道题真是神题,暂时理解不了,抄别人的代码。
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
if index < 1:
return 0
res = [1]
t2=t3=t5=0
nextIdx = 1
while nextIdx < index:
minNum=min(res[t2]*2,res[t3]*3,res[t5]*5)
res.append(minNum)
if res[t2]*2 == minNum:
t2 += 1
if res[t3]*3 == minNum:
t3 += 1
if res[t5]*5 == minNum:
t5 += 1
nextIdx += 1
return res[nextIdx-1]
待续...
数组题汇总(python3)的更多相关文章
- 字符串题汇总(python3)
1.最小编辑距离 假设有两个字符串s1和s2,计算通过增添.删除.替换三种操作后,从s1转变为s2所需要的操作次数. #coding=utf-8 class Solution: def editDis ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- jQuery数组处理汇总
jQuery数组处理汇总 有段时间没写什么了, 打算把jquery中的比较常用的数组处理方法汇总一下 $.each(array, [callback])遍历,很常用 1 2 3 4 5 6 7 8 ...
- PHP数组操作汇总
php 操作数组 (合并,拆分,追加,查找,删除等) - Just Code - ITeye技术网站 PHP操作数组的一些函数介绍 -- 简明现代魔法 PHP数组元素操作实例 -- 简明现代魔法 儿童 ...
- JavaScript Array 数组方法汇总
JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ...
- Leetcode数组题*3
目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加 ...
- 数组API汇总
数组API汇总 Javascript数组API: 1.将数组转化为字符串:2种: 1.var str=String(str); 将数组转化为字符串并分隔每个元素; var arr=[1,2,3]; ...
- [题解+总结]NOIP2010-2015后四题汇总
1.前言 正式开始的第一周的任务--把NOIP2010至NOIP2015的所有D1/2的T2/3写出暴力.共22题. 暴力顾名思义,用简单粗暴的方式解题,不以正常的思路思考.能够较好的保证正确性,但是 ...
随机推荐
- IIS2008配置URlRewriter
一: 1:新增将要公布的站点:将自己主动生成的改站点的应用程序池的.net版本号更改为自己的版本号以及托管管道模式改成集成:如图 2:进入站点配置项里面的处理程序映射 watermark/2/text ...
- Java 实现抽象工厂模式
抽象工厂模式 里面有几个概念:抽象工厂.实体工厂.抽象产品.实体产品 抽象工厂:定义创建产品的抽象方法 实体工厂:详细的创建哪种产品 抽象产品:一个接口或基类 实体产品:实现详细功能,或派生 类图 ...
- POJ 3683 Priest John's Busiest Day (2-SAT+输出可行解)
题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...
- system.web section group下的section
private Configuration _configuration; private ConfigurationSectionGroupCollection sectionGroups; pri ...
- Request returned failure status 401
Request returned failure status 401.Invalid OpenStack Identity credentials.
- CSS盒子居中的常用的几种方法
第一种: 用css的position属性 <style type="text/css"> .div1 { width: 100px; height: 100px; bo ...
- Sqlserver日期操作
Sqlserver日期操作 select GETDATE() as '当前日期', DateName(year,GetDate()) as '年', DateName(month,GetDate()) ...
- error: undefined reference to 'property_set (转载)
转自:http://blog.csdn.net/u011589606/article/details/23474241 in the cpp file, please include #include ...
- PCB 加投率计算实现基本原理--K最近邻算法(KNN)
PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...
- sql case when 用法
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select ...