数组总结
一、题目列表
题目1、构建乘积数组
题目2、调整数组顺序使奇数位于偶数前面(一)
题目3、把数组排成最小的数 JZ45
题目4、丑数 JZ49
题目5、数组中重复的数字 JZ3
题目6、旋转数组的最小数字 JZ11
题目7、打印从1到最大的n位数JZ17
题目8、两数之和 leetcode1 :给定一个整数数组 nums 和一个整数目标值 target
数组基本操作-python
1.数组反转
array = [1,2,3,4]
result = array[::-1]
print(result)
二、题目
题目1、构建乘积数组
JZ66 构建乘积数组
描述
给定一个数组 A[0,1,...,n-1] ,请构建一个数组 B[0,1,...,n-1] ,其中 B 的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。
示例1
输入:
[1,2,3,4,5]
返回值:
[120,60,40,30,24]
1.思路
方法一:暴力求解
方法二:通过两次循环
第一次左边连续相乘
第二次右边连续相乘
时间复杂度:O(n),其中nnn为数组A的长度,遍历两次数组
空间复杂度:O(1),数组B为返回必要空间,不属于额外空间
2.代码
(1)方法一:暴力求解
class Solution:
def multiply(self , A: List[int]) -> List[int]:
# write code here
ans=[1] *len(A)
for i in range(len(A)):
mark = A[:i]+A[i+1:]
for item in mark:
ans[i]*=item
return ans
(2)方法二:通过两次循环
class Solution:
def multiply(self , A: List[int]) -> List[int]:
#初始化数组B
B = [1 for i in range(len(A))]
#先乘左边,从左到右
for i in range(1, len(A)):
#每多一位由数组B左边的元素多乘一个前面A的元素
B[i] = B[i - 1] * A[i - 1]
temp = 1
#再乘右边,从右到左
for i in reversed(range(len(A))):
#temp为右边的累乘
B[i] *= temp
temp *= A[i]
return B
题目2、 调整数组顺序使奇数位于偶数前面(一)
JZ21 调整数组顺序使奇数位于偶数前面(一)
描述
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1.思路
比较简单,先抽出奇数,在抽出偶数
2.代码
#
class Solution:
def reOrderArray(self , array: List[int]) -> List[int]:
# write code here
res = []
for each in array:
if each % 2: res.append(each)
for each in array:
if not each % 2: res.append(each)
return res
题目3、JZ45 把数组排成最小的数
描述
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
1.思路
2.代码
import functools
class Solution:
def mycmp(x,y):
x ,y = str(x), str(y)
if x + y < y+x :
return 1
elif x+y > y+x :
return -1
else:
return 0
def PrintMinNumber(self , numbers: List[int]) -> str:
# write code here
numbers.sort(key=functools.cmp_to_key(mycmp),reverse = True)
return "".join(numbers)
题目4、丑数
描述:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第 n个丑数
1.思路
step 1:第一个丑数1加入数组。
step 2:使用i、j、k三个索引表示该数字有无被乘2、乘3、乘5的指针
step 3:后续继续找n−1n-1n−1个丑数,每次取当前丑数索引乘2、乘3、乘5的最小值加入数组,并计数。
step 4:若是该丑数为相应索引乘上某个数字,则对应的索引往后一位。
参考:https://blog.csdn.net/slove3366/article/details/106724597
2.代码
class Solution:
def GetUglyNumber_Solution(self , index: int) -> int:
#排除0
if index == 0:
return 0
#按顺序记录丑数
num = []
num.append(1)
#记录这是第几个丑数
count = 1;
#分别代表要乘上2 3 5的下标,定义三个指针
i = 0
j = 0
k = 0
while count < index:
#找到三个数中最小的丑数
num.append(min(num[i] * 2,num[j] * 3, num[k] * 5));
count += 1
#判断刚才插入数组是哪个指针,需要指针向前移动一个
if num[count - 1] == num[i] * 2:
i += 1
#由3与已知丑数相乘得到的丑数,那该下标及之前的在3这里都用不上了
if num[count - 1] == num[j] * 3:
j += 1
#由5与已知丑数相乘得到的丑数,那该下标及之前的在5这里都用不上了
if num[count - 1] == num[k] * 5:
k += 1
return num[count - 1]
题目5、数组中重复的数字 JZ3
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
返回描述:
如果数组中有重复的数字,函数返回true,否则返回false。
如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。(ps:duplication已经初始化,可以直接赋值使用。)
1.思路
2.代码
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
tmp = []
for i in numbers:
if i in tmp:
duplication[0] = i
return True
else:
tmp.append(i)
return False
题目6、旋转数组的最小数字 JZ11
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1 le n le 100001≤n≤10000,数组中任意元素的值: 0 le val le 100000≤val≤10000
要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)
1.思路
二分法实现,先取得中间的数,和最右边对比,判断中间到最右是否升序数组
2.代码
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param rotateArray int整型一维数组
# @return int整型
#
class Solution:
def minNumberInRotateArray(self , r: List[int]) -> int:
# write code here
left, right = 0, len(r)-1
while left < right:
mid = (left+right-1)//2
if r[mid] < r[right]:
right = mid
elif r[mid] > r[right]:
left = mid+1
else:
right -= 1
return r[left]
题目7、打印从1到最大的n位数JZ17
1.思路
2.代码
class Solution:
def printNumbers(self , n: int) -> List[int]:
# write code here
seq = []
for i in range(1, 10**n):
seq.append(i)
return seq
题目8、 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。