力扣刷题记录4

题目难度:中等

题目描述:

房间中有 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));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值