​力扣解法汇总672-灯泡开关 Ⅱ

news/2024/7/5 3:19:36

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

GitHub - September26/java-algorithms: 算法题汇总,包含牛客,leetCode,lintCode等网站题目的解法和代码,以及完整的mode类,甚至链表代码生成工具都有提供。

原题链接:力扣


描述:

房间中有 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 ,[开]
示例 2:

输入:n = 2, presses = 1
输出:3
解释:状态可以是:
- 按压开关 1 ,[关, 关]
- 按压开关 2 ,[开, 关]
- 按压开关 3 ,[关, 开]
示例 3:

输入:n = 3, presses = 1
输出:4
解释:状态可以是:
- 按压开关 1 ,[关, 关, 关]
- 按压开关 2 ,[关, 开, 关]
- 按压开关 3 ,[开, 开, 开]
- 按压开关 4 ,[关, 开, 开]
 

提示:

1 <= n <= 1000
0 <= presses <= 1000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bulb-switcher-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:
* 首先,最多执行4次变化,就能得出所有的结果,不需要真的执行1000次。
* 其次,每次计算时,只需要计算1-6的范围即可,不需要计算后面的,因为后面的都可以认为时1-6的重复。6是最小公倍数,开关1的公倍数是1,开关2/3的公倍数是2,开关4的公倍数是3,
* 所以,我们最多执行4次开关,遍历求所有可能即可。

代码:

public class Solution672 {

    public int flipLights(int n, int presses) {
        Set<String> lastSet = new HashSet<>();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            builder.append("1");
        }
        lastSet.add(builder.toString());
        Set<String> nextSet = new HashSet<>();
        for (int i = 0; i < Math.min(4, presses); i++) {
            nextSet = new HashSet<>();
            //第一种
            transformation(lastSet, nextSet, 1);
            transformation(lastSet, nextSet, 2);
            transformation(lastSet, nextSet, 3);
            transformation(lastSet, nextSet, 4);
            lastSet = nextSet;
        }
        return lastSet.size();
    }

    private Set<String> transformation(Set<String> lastSet, Set<String> nextSet, int mode) {
        StringBuilder builder = new StringBuilder();
        for (String str : lastSet) {
            builder.setLength(0);
            char[] chars = str.toCharArray();
            for (int k = 0; k < chars.length; k++) {
                boolean isReversal = false;
                if (mode == 1) {
                    isReversal = true;
                } else if (mode == 2) {
                    if (k % 2 == 0) {
                        isReversal = true;
                    }
                } else if (mode == 3) {
                    if (k % 2 != 0) {
                        isReversal = true;
                    }
                } else if (mode == 4) {
                    if (k % 3 == 0) {
                        isReversal = true;
                    }
                }
                if (!isReversal) {
                    builder.append(chars[k]);
                    continue;
                }
                if (chars[k] == '0') {
                    builder.append("1");
                } else {
                    builder.append("0");
                }
            }
            nextSet.add(builder.toString());
        }
        return nextSet;
    }
}


http://lihuaxi.xjx100.cn/news/55065.html

相关文章

【编程语言】什么是闭包?你可能经常在用它,但不知道它叫闭包!

文章目录什么是闭包用例不具有一等函数的语言中的闭包闭包可能造成内存泄漏ps&#xff1a;数学中的闭包wiki-closure 百度百科-闭包 在 JS 中闭包为什么叫「闭包」&#xff0c;而不用其它名称命名&#xff1f; 阮一峰-学习Javascript闭包&#xff08;Closure&#xff09; 什么是…

蛇形矩阵蒸滴好玩

先来看看题目&#xff1a; 描述 康托尔三角是由著名数学家康托尔设计的一个整数三角&#xff0c;可以用来证明所有有理数与自然数一一对应&#xff0c;亦即有理数集是一个可数集。康托尔三角的构造如下&#xff1a; 01 02 06 07 15 16 28 29 45 46 03 05 08 14 17 27 30 44 4…

基于python+django框架+Mysql数据库的企业公司网站系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于python的公司企业网站&#xff0c;整体基于B/S架构&#xff0c;技术上使用基于python的Django框架来实现&#xff1b;通过后台添加公司资讯、公司产品、公司产品案例、公司资讯、查看注册用户、查看留言…

Python 导入模块

Python 导入模块1.import 模块名2.import 模块名 as 名称缩写3.import 模块名.子模块名 as 名称缩写4.from 模块名 import 函数5.from 模块名.子模块名 import 函数模块 是第三方专门为了解决某些特定问题而编写的工具。Python 本身自带了一些常用的模块&#xff0c;例如&#…

图像处理之空间滤波

1 原理 1.1 空间滤波简介 滤波器即只让一部分频率的波形通过来达到波形过滤目的的器件。空间域指一张图像像素平面一定范围内的像素域&#xff0c;相对的是时间域&#xff0c;即多帧图像之间的关系&#xff0c;主要在处理视频帧时描述。在图像处理中&#xff0c;滤波分为两种&…

PTA - 数据库合集6(10题)

目录 10-1 查询选修‘C语言’课程的学生 10-2 查询平均分高于80分的学生 10-3 查询平均成绩最高的前3名同学 10-4 批量插入学生记录 10-5 修改女生成绩 10-7 spj-查询供应工程 j1 的供应商 10-8 spj-查询至少使用s1供应商所供应的全部零件的工程 10-9 查询年龄18-20之间…

Linux--权限管理

学习目标1. Linux权限管理1.1 用户分类2. 用户类型和访问权限2.1 理解什么是权限3 文件类型和权限操作3.1 修改权限3.2 关于root3.3 更改文件拥有者3.4 修改组权限3.5 目录权限3.5.1 粘滞位3.6 关于目录权限的总结3.7 默认权限3.7.1 自定义默认权限1. Linux权限管理 1.1 用户分…

Kubernetes(k8s)基础之三:K8s常用命令

目录 kubectl的基本命令 k8s常用操作命令 k8s常用命令操作示例 资源管理 命令式对象管理 kubectl命令 资源类型 查看k8s对象状态 k8s对象配置 k8s容器编排配置文件模板 1. deployment 相关使用 创建deployment 更新deployment 回退deployment 暂停和恢复deploym…