一、非自身以外数字的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
def test2(nums):
n = len(nums)
res = [0] * n
k = 1
for i in range(n):
res[i] = k
k = k * nums[i]
k = 1
for i in range(n - 1, -1, -1):
res[i] = k * res[i]
k = k * nums[i]
return res
nums = [1, 2, 3, 4]
res = test2(nums)
print(res)
二、最大数
给定一个list 由一些非负整数组成 ,重新排列他们的顺序把他们组成一个最大的整数。
例子:
输入:
[30,1]
返回值:
“301”
import itertools
nums = [1, 201, 20, 9, 8]
s = list(map(str, nums))
print(s)
ordered = sorted(s, key=lambda x: x, reverse=True)
print(ordered)
def fn(nums):
s = list(map(str, nums)) # [30,1] ——》 ['30', '1']
ordered = sorted(s, key=lambda x: x, reverse=True) # 根据首位排序
# 首位相同的,进行二次排序
for i in range(len(ordered) - 1):
if ordered[i][0] == ordered[i + 1][0]:
if int(ordered[i][-1]) < int(ordered[i + 1][-1]):
ordered[i], ordered[i + 1] = ordered[i + 1], ordered[i]
return int(''.join(ordered))
nums = [301, 302, 34]
print(fn(nums))
三、奇数排序
哈利波特获得了一个数字列表,他的任务是必须将奇数按升序排序,同时将偶数保留在原来的位置。魔法师们,快来帮帮他吧~
nums = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
def test(nums):
res1 = sorted([i for i in nums if i % 2 == 1])
for index in range(len(nums)):
if nums[index] % 2 != 0:
nums[index] = res1[0]
res1.pop(0)
return nums
r = test(nums)
print(r)
四、73. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
思路:
用两个标记数组分别记录每一行和每一列是否出现0
首先遍历该数组一次,如果某个元素为0,那么就将该元素所在的行和列
#所对应的标记数组置为true,最后我们再次遍历数组,用标记数组更新原数组即可。
class S73:
def func(self,nums11):
m,n=len(nums11),len(nums11[0])
row,col=[False]*m,[False]*n
for i in range(m):
for j in range(n):
if nums11[i][j]==0:
row[i]=col[j]=True
for i in range(m):
for j in range(n):
if row[i] or col[j]:
nums11[i][j]=0
return nums11
r=S73()
nums11 = [[1,1,1],[1,0,1],[1,1,1]]
print(r.func(nums11))