Skip to content

Latest commit

 

History

History
58 lines (53 loc) · 1.56 KB

File metadata and controls

58 lines (53 loc) · 1.56 KB

数学题

第一步:找周期

       01 02 03 04 05 06 07 08 09 10 11 12
  k1   11 11 11 11 11 11 11 11 11 11 11 11
  k2   00 11 00 11 00 11 00 11 00 11 00 11
  k3   11 00 11 00 11 00 11 00 11 00 11 00
  k4   11 00 00 11 00 00 11 00 00 11 00 00

可以看到6个一组 下面是开关影响情况: 6n+1:1 3 4 6n+2:1 2 6n+3:1 3 6n+4:1 2 4 6n+5:1 3 6n+6:1 2 可以看出,6n+3和6n+5状态相同 6n+2和6n+6状态相同。 所以分为4组。 G1:6n+1 | 1 3 4 G2:6n+2,6n+6 | 1 2 G3:6n+3,6n+5 | 1 3 G4:6n+4 | 1 2 4 可以看到, G1和G3差一个4,所以4按偶数下的时候G1和G3一样;否则不一样。 G2和G4也差个4,所以G1G3一样时(4按偶数下),G2G4一样;否则不一样。 因此,G1,G2,G3固定,G4就一定固定。

分情况讨论

当灯泡个数n=1,可能有开关两种状态(按1关,按2开) 当灯泡个数n=2, 按一次 11 按1:00 按2:10 按3:01 按4:10 按两次 00可得到11 所以,按一次可以得到3种,两次就4种。 当灯泡个数n=3: 按一次(按照上面模式),可以得到4种;两次7种;三次可以完全得到8种。 当n>3:别的灯泡状态和前面三个一一对应了。

代码实现

所以代码就很简单

class Solution {
    public int flipLights(int n, int presses) {
        if (presses == 0) return 1;
        if (n == 1) return 2;
        if (n == 2) return presses == 1 ? 3 : 4;
        if (presses == 1) return 4;
        return presses == 2 ? 7 : 8;
    }
}