lintCode学习之路:电灯切换

电灯切换

一个房间中有 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\m123
12222
23444
34788
4788

 
以上结果有兴趣可以自行推断,代码就比较简单了,把分析的结果贴上去就行了,特别要注意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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值