3782.交替删除操作后最后剩下的整数
难度:困难
问题描述:
给你一个整数n。
我们将1到n的整数按从左到右的顺序排成一个序列。然后,交替地执行以下两种操作,直到只剩下一个整数为止,从操作1开始:
操作1:从左侧开始,隔一个数删除一个数。
操作2:从右侧开始,隔一个数删除一个数。
返回最后剩下的那个整数。
示例1:
输入:n=8
输出:3
解释:
写下序列[1,2,3,4,5,6,7,8]。
从左侧开始,我们删除每隔一个数字:[1,2,3,4,5,6,7,8]。剩下的整数是[1,3,5,7]。
从右侧开始,我们删除每隔一个数字:[1,3,5,7]。剩下的整数是[3,7]。
从左侧开始,我们删除每隔一个数字:[3,7]。剩下的整数是[3]。
示例2:
输入:n=5
输出:1
解释:
写下序列[1,2,3,4,5]。
从左侧开始,我们删除每隔一个数字:[1,2,3,4,5]。剩下的整数是[1,3,5]。
从右侧开始,我们删除每隔一个数字:[1,3,5]。剩下的整数是[1,5]。
从左侧开始,我们删除每隔一个数字:[1,5]。剩下的整数是[1]。
示例3:
输入:n=1
输出:1
解释:
写下序列[1]。
最后剩下的整数是1。
提示:
1<=n<=1015
问题分析:
这个问题主要完成两个操作,一是从左侧开始,向右隔一个数删除一个数,并返回处理之后的结果。二是从右侧开始,向左隔一个数删除一个数,并返回处理之后的结果。这两个操作用python列表切片操作可以快速完成,设计的两个函数分别是operate_to_right(a)和operate_to_left(a)。然后通过这两个函数,构造循环对原始的列表交替进行删除操作,得到最后剩下的那个数,问题得到解决。
程序如下:
python
#从列表a左侧开始,向右隔一个数删除一个数,返回处理之后的结果
def operate_to_right(a):
return a[::2]
#从列表a右侧开始,向左隔一个数删除一个数,返回处理之后的结果
def operate_to_left(a):
return a[::-2][::-1]
#主程序
n=int(input('pls input n='))
a=list(range(1,n+1))
while len(a)>1:
b=operate_to_right(a)
print(f'从{a}左侧开始,向右每隔一个数删除一个数字,剩下的整数是{b}')
a=operate_to_left(b)
print(f'从{b}右侧开始,向左每隔一个数删除一个数字,剩下的整数是{a}')
print(f'最后剩下的数字是{a[0]}')
运行实例一
pls input n=1
最后剩下的数字是1
运行实例二
pls input n=3
从[1, 2, 3]左侧开始,向右每隔一个数删除一个数字,剩下的整数是[1, 3]
从[1, 3]右侧开始,向左每隔一个数删除一个数字,剩下的整数是[3]
最后剩下的数字是3
运行实例三
pls input n=9
从[1, 2, 3, 4, 5, 6, 7, 8, 9]左侧开始,向右每隔一个数删除一个数字,剩下的整数是[1, 3, 5, 7, 9]
从[1, 3, 5, 7, 9]右侧开始,向左每隔一个数删除一个数字,剩下的整数是[1, 5, 9]
从[1, 5, 9]左侧开始,向右每隔一个数删除一个数字,剩下的整数是[1, 9]
从[1, 9]右侧开始,向左每隔一个数删除一个数字,剩下的整数是[9]
最后剩下的数字是9