目录
1. rand5()可以求出1-5中任意一个数,要求rand7()--1-7中任意一个数
2. 给定一个数字,按照原有数字中的各个位上面的数字进行组合,求出比原有数字大的数中最小的数。例如:1234 -> 1243 ,1243 ->1324 ,1324 -> 1342;
1. rand5()可以求出1-5中任意一个数,要求rand7()--1-7中任意一个数
基本思路:利用一个随机数生成另外一个随机数,一般都是利用n进制来进行计算;
from random import *
def rand5():
return randint(1, 5)
def rand7():
tmp = pow(5, 1) * (rand5() - 1) + pow(5, 0) * (rand5() - 1) # from 0 to 24
while True:
if tmp <= 20:
return (tmp % 7) + 1
2. 给定一个数字,按照原有数字中的各个位上面的数字进行组合,求出比原有数字大的数中最小的数。例如:1234 -> 1243 ,1243 ->1324 ,1324 -> 1342;
基本思路:有重复数字的全排列思想;
def IntToList(nums):
ans = []
while nums:
ans.append(nums % 10)
nums //= 10
return ans[::-1]
def ListToInt(nums):
ans = 0
while nums:
ans = ans * 10 + nums.pop()
return ans
def permutation(nums):
def dfs(nums, ans, path, used):
if len(path) == len(nums):
ans.append(path[:])
return
else:
for i in range(len(nums)):
if used[i] or (i > 0 and nums[i] == nums[i-1] and not used[i-1]): # 这个待继续理解
continue
path.append(nums[i])
used[i] = True
dfs(nums, ans, path, used)
used[i] = False
path.pop()
list_nums = IntToList(nums)
list_nums.sort()
used = [False for _ in range(len(list_nums))]
ans = []
dfs(list_nums, ans, [], used)
# 将全排列转换为整数,再排序;
ans = list(map(ListToInt, ans))
ans.sort()
for i in range(len(ans)):
if ans[i] == nums and ans[i+1] > ans[i]:
return ans[i+1]
return None
3. 计算每个数左边/右边第一个比其大/小的值
基本思路:
求左边第一个比其大的值,顺序遍历,维护一个递减的栈;
求右边第一个比其大的值,逆序遍历,维护一个递减的栈;
求左边第一个比其小的值,顺序遍历,维护一个递增的栈;
求右边第一个比其小的值,逆序遍历,维护一个递增的栈;
def LeftFirstGreater(nums):
if not nums: return None
size = len(nums)
if size == 1: return [-1]
stack = [nums[0]]
ans = [-1]
for ind in range(1, len(nums)):
while stack and nums[ind] > stack[-1]:
stack.pop()
if stack:
ans.append(stack[-1])
else:
ans.append(-1)
stack.append(nums[ind])
return ans
def RightFirstGreater(nums):
if not nums: return None
size = len(nums)
if size == 1: return [-1]
stack = [nums[size-1]]
ans = [-1]
for ind in range(size-2, -1, -1):
while stack and nums[ind] > stack[-1]:
stack.pop()
if stack:
ans.append(stack[-1])
else:
ans.append(-1)
stack.append(nums[ind])
return ans[::-1]