小红书20220904秋招-数据开发-笔记

本文介绍了三个算法问题:序列的镜像复制找到指定位置的数字,通过加减操作使数组乘积为7的最少步骤,以及在限制步数内的最短过路费。涉及贪心策略、动态规划和图的广度优先搜索算法,展示了在信息技术领域解决复杂问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1:镜像序列(找规律)

一个序列的生成方式如下:
序列生成需要一个基础序列A,这个序列由n个不大于100的数字组成,同时给定镜像复制次数n。
然后对于A进行m次镜像复制,例如序列A={1,2,3}
则一次镜像复制后得到的序列是{1,2,3,3,2,1)
两次镜像复制得到的序列是B=(1,2,3,3,2,1,1,2,3,3,2,1)。

现在给出你生成一个序列所需要的参数,请你计算该序列的第k位是多少。 输人描述 输入第一行包含三个整数n,m,k,含义如题所示。
(1<=n<=100,1<=m<=60,1<=k<=1e18,部分数据k<10000)
输入第二行包含n个正整数,每个正整数都不大于100,表示基础序列A。 数字间有空格隔开 输出仅包含一个正整数,即序列第k位的数字。

input:
3 3 10
1 2 3

# 输入
n, m, k = list(map(int, input().split()))
a = list(map(int, input().split()))
# 复杂度极高的解法:
# 用for循环生成
k = k - 1
for i in range(m):
	i += 1
	a = a + list(reversed(a)) #或者 a = a + a[::-1] 切片截取
print(a[k])

#用除余方法:
a = a + a[::-1]
k = k / (2*n) - 1
print(a[k])

题目2:加减数组元素使乘积为7(贪心或动态规划)

给定n个整数a1, a2, a3…an。每次操作可以选择其中一个数,并将这个数加上1或者减去1。
小红非常喜欢7这个数,他想知道至少需要多少次操作可以使这n个数的乘积为7?
输入描述
第一行输入一个正整数n,表示整数的个数。
第二行输入n个整数a1, a2, a3…an,其中ai表示第i个数。
输出描述
输出一个整数,表示将所有数的乘积变为7最少需要的操作次数。

input:
5
-6 0 2 -2 3
output:
6

# 贪心算法

# 一个元素 7
# 两个元素 7和1 ++ --
# 三个元素 7 1 1 +++ +--
# 贪心方法:先找最接近7或者-7的;再将其他值变为-1或1
# 输入
n = int(input())
A = list(map(int,input().split))
count = 0
neg = 0
if n > 1:
	# map函数 map(function,iterable) iterable一个或者多个序列
	# def f(x):
	#     return x*x
	# print(list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
	# str.split(str="", num=string.count(str)) num表示分隔次数,遇到num次分隔,后面的不管
	# 寻找list里距离7或者-7最近的值,取绝对值法对原来的list进行取值
	B = max(A, key = abs) #返回取绝对值后最大的值对应的原值
	# max函数里用key关键词引用一个函数,先对该list调用函数再取max,并且返回的是原来list的值
	# 字典里用key = a.get 表示a.get(item) 输出最大的值(item)对应的键(key)。否则在字典里的key中选最大值。
	A.remove(B) #将该数值从列表中去除
	if B>=0:
		count += abs(B-7)
	else:
		count += abs(B+7)
		# 负数要记录
		neg += 1
	# 对其他数取-1和1值,考虑如果有0,则可以不需要在意neg
	M = min(A, key = abs)
	# 将所有值调整为1或-1
	for i in A:
		# 把小于0的都调整为-1
		if i < 0 :
			count += abs(i + 1)
			neg += 1
		# 把大于等于0的都调整为1
		else:
			count += abs(i - 1)
	# 如果有0,不需要考虑neg,只要变为1或-1都可以
	if M != 0 && (neg / 2) != 0:
		count += 2
else:
	count = abs(7-B)
print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值