Bootstrap

少儿Python每日一题(1):开关的状态

原题解答:

本次的题目如下所示(原题出处:蓝桥杯):

【提示信息】
小蓝家的灯是拉线型开关的,拉一次灯开,再拉一次灯关,未拉之前灯是熄
灭状态。
【编程实现】
输入一个正整数M(1<M<100),作为小蓝拉灯的次数,判断拉灯M次后,灯
是点亮状态还是熄灭状态。
输入描述:输入一个正整数M作为拉灯的次数(1<M<100)
输出描述:如果灯是点亮状态输出整数“1”,如果灯是熄灭状态输出整数
“0”。
【样例输入】
5
【样例输出】
1

方法一(最优解):

拿到这道题,我们可以先找一下规律。灯的状态一开始是熄灭的,拉一次开,再拉一次关。我们可以多拉几次开关试一下:

次数状态
1
2
3
4
5
6
…………

 通过上面的表格,我们可以很明显发现:当拉灯的次数为奇数时,灯的状态为开;当拉灯的次数为偶数是,灯的状态为关。总结出规律后,我们可以使用分支结构的语句完成程序:

m = int(input())
if m % 2 == 1:
    print(1)
else:
    print(0)

该解的时间复杂度O(1)。

方法二(次优解):

灯的初始状态为关(False),第一次拉变成开(True,即not False),第二次拉变成关(False, 即not Frue)。如果我们将灯的状态定义为布尔值False,每拉一次灯做一次not运算。那通过循环语句一次次拉,最终就能得到灯的状态。

m = int(input())
s = False
for i in range(1, m + 1):
    s = not s
print(int(s))

该解的时间复杂度O(n)

本题拓展

该题型主要考查对周期性规律的总结能力,题目难度:★

此类型的题目如果可能的条件有多个,难度会略有增加,但整体思路依然不变。我们看看拓展题:

小芳的课余爱好比较丰富,她给自己排了一周的课余时间安排如下:

星期一星期二星期三星期四星期五星期六星期日
弹钢琴游泳编程素描弹钢琴编程素描

假设今天是星期日,编写一个程序,计算n天后小芳计划做什么。

输入描述:输入一个正整数n,作为天数

输出描述:输出这一天小芳在做什么

输入样例:

4

输出样例:

素描

 方法一:

通过前面拉开关的题目,我们可以模仿那道题的方式,开关灯有2种可能,而一周有7天,我们可以通过除7的余数进行判断,由二分支结构改成多分支结构即可完成代码:

n = int(input())
if n % 7 == 1 or n % 7 == 5:
    print('弹钢琴')
elif n % 7 == 2:
    print('游泳')
elif n % 7 == 3 or n % 7 == 6:
    print('编程')
elif n % 7 == 4 or n % 7 == 0:
    print('素描')

方法二:

在遇到情况较多的时候,我们可以合理利用列表的索引,可以大幅度减少代码的复杂度。但是我们要注意,列表的索引从0开始,因此星期日做的事情需要放到列表的第一个元素。

n = int(input())
plans = ['素描', '弹钢琴', '游泳', '编程', '素描', '弹钢琴', '编程']
print(plans[n%7])

;