电灯切换
一个房间中有 n 盏灯最初是开着的,并且墙上有 4 个开关。在对开关进行 m 次未知的操作后,你需要返回这 n 盏灯有多少种不同的状态。
假设 n 盏灯的标号为 [1, 2, 3 …, n], 4 个开关的功能如下:
1.将所有灯从开变成关,从关变成开。
2.将标号为偶数的灯从开变成关,从关变成开。
3.将标号为奇数的灯从开变成关,从关变成开。
4.将标号为 (3k + 1) 的灯从开变成关,从关变成开,k = 0, 1, 2…
解题思路:
这个题目一开始看确实有些看不大懂,按照题目要求第一反应就是程序去实现开关逻辑,但仔细一想实现起来非常困难。其实这个题目是一个很简单的分类讨论问题,按照题目要求可知灯泡的状态总共有以下几种
- 全亮
- 奇数亮
- 偶数亮
- 3k+1亮
- 奇数亮、3k+1亮
- 偶数亮、3k+1亮
- 奇数亮、偶数亮、3k+1不亮
- 全不亮
下面列出m、n所有的可能情况
n\m | 1 | 2 | 3 | … |
---|---|---|---|---|
1 | 2 | 2 | 2 | 2 |
2 | 3 | 4 | 4 | 4 |
3 | 4 | 7 | 8 | 8 |
… | 4 | 7 | 8 | 8 |
以上结果有兴趣可以自行推断,代码就比较简单了,把分析的结果贴上去就行了,特别要注意n或m为0的情况
public int flipLights(int n, int m) {
if(n==0){
return 0;
}
if(m==0){
return 1;
}
if(n==1){
return 2;
}
if(n==2){
if(m==1){
return 3;
}
return 4;
}
if(m==1){
return 4;
}
if(m==2){
return 7;
}
return 8;
}