茶杯:N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置。

N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置。


(本文获得CSDN质量评分【92】)

【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


N个杯子排成一排,第X个杯子藏有球
茶 杯
(交换任意两个杯子K次后,找出藏球杯子位置)


本文质量分:

92
本文地址: https://blog.csdn.net/m0_57158496/article/details/128874661

CSDN质量分查询入口:http://www.csdn.net/qc


目 录


◆ 茶杯

在这里插入图片描述

1、题目图片中的代码


def other():
    ''' 题目图片中的代码 '''
    list = []
    list = input().split(' ')
    a = eval(list[0])
    b = eval(list[1])
    c = eval(list[2])
    x = 0
    y = 0
    
    for i in range(c):
        list = input().split(' ')
        x = eval(list[0])
        y = eval(list[1])
        
        if x == b: b = y
        elif y == b: b = x
    print(b, end=' ')

在这里插入图片描述

1.1 代码瑕疵

  题目图片中的代码,是有点小问题,但也未曾见有多费时的地方,不明白是怎么超时的?😣😣只循环k次,应该不会超时才对哦。


小瑕疵:

  1、list是python关键字,却用作变量命名。代码中的变量命名重写了Python内置函数list()。

  2、代码冗余。Python中,变量不需要事先声明(设定),可以直接赋值。list = []、x = 0、y = 0三条语句可以直接删除。


1.2 代码瘦身


def other():
    ''' 图片中的代码 '''
    lis = input().split(' ')
    a = eval(lis[0])
    b = eval(lis[1])
    c = eval(lis[2])

    for i in range(c):
        lis = input().split(' ')
        x = eval(lis[0])
        y = eval(lis[1])
        
        if x == b: b = y
        elif y == b: b = x
    print(b, end=' ')


1.3 用map()进一步瘦身


def other():
    ''' 图片中的代码 '''
    a, b, c = map(eval, input().split())
    
    for i in range(c):
        x, y = map(eval, input().split())
        
        if x == b: b = y
        elif y == b: b = x
    
    print(b, end=' ')

1.4 代码优化

  用题目中定好的变量字符命名变量,才更符题。input()有输入提示字符,才更人性。“好”代码,二者都不可或缺。😋


def other():
    ''' 图片中的代码 '''
    n, x, k = map(eval, input(f"\n{'输入:':>12}").split())
    
    for i in range(k):
        a, b = map(eval, input(f"{'':>15}").split())
        
        if x == a: x = b
        elif x == b: x = a
    
    print(f"\n\n{'输出:':>12}{x}\n")

1.5 优化代码运行效果

在这里插入图片描述


回页目录

2、题目

2.1 题目描述

  将N个杯子排成一排,其中将球藏在第X个杯子中,交换任意两个不同杯子的位置。如果移动藏有球的杯子,球会随杯子一起移动。交换执行K次后,问球在哪个杯子中。

2.2 解题代码试炼

在这里插入图片描述

2.3 计算程序用时


  加载time模块time()读取机器系统当前秒,计算用时。


在这里插入图片描述


回页目录

3、题目分析


  输入为k+1行数字字符串,第一行为英文空格分隔的n、x、k,后面k行的数字为依次交换杯子的位置。首先要对输入字符进行拆分,并还原成数字处理。球会随杯子移动,每次交换杯子都要追踪球的位置。完成k次交换后,输出球的位置完成解题。

3.1 关键点

关键点:

  只追踪有球的茶杯X就好。

if a == x: x = b
elif b == x: x = a

  如果当前移动到有球的茶杯,记录交换后有球茶杯的位置。


3.2 输入数据解析

  • a. 解析n、x、k

  鉴于题目输入格式,用字符串的split()方法据回车换行符解析每行。进一步用split()解析第一行三个数据,map()函数实现整型转换和赋值。


    lis = string.split('\n') # 鉴于题目输入格式,用字符串的split方法据回车换行符解析每行。
    n, x, k = map(int, lis[0].split()) # 进一步解析第一行三个数据。

  • b. 遍历解析要交换杯子位置

  遍历解析茶杯移动的k行数据,用split()方法拆分每行整数,map()函数转整赋值。


    for i in range(k):
        a, b = map(int, lis[i+1].split()) # 遍历解析茶杯移动的k行数据。

3.3 追踪藏球茶杯

  用两个通道的if处理、并记录有球茶杯移动、交换茶杯后的新位置X。当前交换的杯子藏球,则藏球杯子会更新位置;无藏球,则藏球杯子位置不变。


        if a == x: # 用两个通道的if处理,并记录有球茶杯移动交换茶杯后的新位置X。
            x = b
        elif b == x:
            x = a

回页目录

4、我的代码实现(shif_teacup)


代码运行效果
在这里插入图片描述


  打印出茶杯交换的过程,可以看得出藏球杯子的追踪过程。

源码


def shift_teacup(input_string):
    ''' 交换任意茶杯找出藏球 '''
    lis = string.split('\n') # 鉴于题目输入格式,用字符串的split方法据回车换行符解析每行。
    n, x, k = map(int, lis[0].split()) # 进一步解析第一行三个数据。

    print(f"\n\n{'~'*50}\n茶杯移动过程:\n")

    for i in range(k):
        a, b = map(int, lis[i+1].split()) # 遍历解析茶杯移动的k行数据。
        
        if a == x: # 用两个通道的if处理,并记录有球茶杯移动交换茶杯后的新位置X。
            x = b
        elif b == x:
            x = a
        
        print(f"{i+1:>12}:{a}, {b},    X = {x}")
    
    return x # 返回有球茶杯的最终位置。


回页目录

5、完整源码

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8
from time import time # 载入time模块当前时间秒获取方法time。
start_sec = time() # 记录机器系统当前时间秒。


def shift_teacup(input_string):
    ''' 交换任意茶杯找出藏球 '''
    lis = input_string.split('\n') # 鉴于题目输入格式,用字符串的split方法据回车换行符解析每行。
    n, x, k = map(int, lis[0].split()) # 进一步解析第一行三个数据。

    print(f"\n\n{'~'*50}\n茶杯移动过程:\n")

    for i in range(k):
        a, b = map(int, lis[i+1].split()) # 遍历解析茶杯移动的k行数据。
        
        if a == x: # 用两个通道的if处理,并记录有球茶杯移动交换茶杯后的新位置X。
            x = b
        elif b == x:
            x = a
        
        print(f"{i+1:>12}:{a}, {b},    X = {x}")
    
    return x # 返回有球茶杯的最终位置。


def other():
    ''' 图片中的代码 '''
    n, x, k = map(eval, input(f"\n{'输入:':>12}").split())
    
    for i in range(k):
        a, b = map(eval, input(f"{'':>15}").split())
        
        if x == a: x = b
        elif x == b: x = a
    
    print(f"\n\n{'输出:':>12}{x}\n")


if __name__ == '__main__':
    other()
    input() 
    # 输入数据:
    in_s = '''3 2 4
1 3
3 2
3 1
2 3'''

    # 结果格式化输出:
    print(f"\n输入:\n{in_s}")
    print(f"\n\n{'~'*50}\n输出:\n{shift_teacup(in_s)}\n{'~'*50}\n{'':>16}程序用时 {time()-start_sec:.6f} 秒\n")


回页首

__上一篇:__ 两数之和 (找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标)

__下一篇:__ 茶杯 (N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置)

我的HOT博:

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦幻精灵_cq

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值