题目难度:中等
题目描述:
房间中有 n 只已经打开的灯泡,编号从 1 到 n 。墙上挂着 4 个开关 。
这 4 个开关各自都具有不同的功能,其中:
开关 1 :反转当前所有灯的状态(即开变为关,关变为开)
开关 2 :反转编号为偶数的灯的状态(即 2, 4, ...)
开关 3 :反转编号为奇数的灯的状态(即 1, 3, ...)
开关 4 :反转编号为 j = 3k + 1 的灯的状态,其中 k = 0, 1, 2, ...(即 1, 4, 7, 10, ...)
你必须 恰好 按压开关 presses 次。每次按压,你都需要从 4 个开关中选出一个来执行按压操作。
给你两个整数 n 和 presses ,执行完所有按压之后,返回 不同可能状态 的数量。
示例 1:
输入:n = 1, presses = 1
输出:2
解释:状态可以是:
- 按压开关 1 ,[关]
- 按压开关 2 ,[开]
解决思路:今天的题目对我来说算是困难了,一开始题目都没有看懂,写代码写了半天都不清楚。回归题目,灯泡数量随意、按压次数随意,求不同状态的数量。注意此处的按压次数不是只按压一个按钮,而是只能在原始基础的状态下按压一次按钮并且记录此时的状态。如果presses为2,那就是从原始的状态下在4个按钮中选2个按钮按下,记录此时状态。
因为有4个按钮,所以每次按压一个时,每个按钮都按1次,4种情况;
每次按压2个,12=3,13=2,23=1,14,24,34,11/22/33/44=初始状态,7种情况
每次按压3个,123=初始,234=14,124=34,134=24,111/222/333/444=1/2/3/4,其余都是重复的结果,所以一共有8种情况
我们就来列举所有情况:灯泡为0时,不管按压多少次,一种情况;按压次数为0,灯泡不管多少次,一种情况。
灯泡=1,按压=1,2种; 灯泡=1,按压=2,2 灯泡=1,按压=3,2
灯泡=2,按压=1,3种; 灯泡=2,按压=2,4 灯泡=2,按压=3,4
灯泡=3,按压=1,4种; 灯泡=3,按压=2,7 灯泡=3,按压=3,8
灯泡=n,按压=1,4种;n>=3 灯泡=n,按压=2,7 灯泡=n,按压=3,8
特殊情况:灯泡为1时,只有开和关。按压个数为3及其以上时重复。
将这些情况的个数用数组存储起来,在依照不同的按压个数和灯泡数输出相应的值即可。
[2,3,4,4] [2,4,7,7] [2,4,8,8]
import java.util.Scanner;
public class Solution{
public int flipLights(int n, int presses) {
int[] array;
if (n == 0 || presses == 0) {
return 1;
}
if (presses == 1) { //按压一次时,不同数量的灯泡对应的不同情况数量
array = new int[]{2, 3, 4, 4};
}
if (presses == 2) { //两次
array = new int[]{2, 4, 7, 7};
}
else { //超过3次及其以上的都跟三次一样
array = new int[]{2, 4, 8, 8};
}
if (n < 4) { //灯泡数量小于等于4时的情况
return array[n - 1];
}
return array[3];
}
public static void main(String args[]){
Solution ans = new Solution();
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int pre = sc.nextInt();
System.out.println(ans.flipLights(num, pre));
}
}