时间限制:1000ms
内存限制:256M
题目描述:
有k盏灯,灯全熄灭,灯下有开关,编号为 1-k;有 k 个学生,编号也是 1-k ,依次从灯下走过,如果学生发现经过的灯的编号恰好可以整除自己的编号,则拉一下灯的开关(关变开,开变关),问最后哪些灯亮着?
输入描述:
k 编号
输出描述:
所有亮着的灯的编号
提示:
1<= k<=100000
题目分析:
这题很古怪,因为灯和人的编号都是 1-k ,所以最后灯肯定都是亮着的。
代码实现:
package 亮灯问题;
import java.util.*;
/** * @author 江七 * @version 1.0 * @date 2021/9/30 10:21 */
public class Main {
public static void main(String[] args) {
// 如果有其他情况需要判断 可修改示例代码
Scanner cin = new Scanner(System.in);
int k = cin.nextInt();
int[] sum = getLightOnNum(k);
String result = "";
for (int num : sum) {
result += num + ",";
}
System.out.println(result.substring(0, result.length() - 1));
}
// 请补齐方法
public static int[] getLightOnNum(int k) {
Map<Integer, Boolean> map = new HashMap<>();
for (int i = 1; i <=k; i++) {
//灯初始化为全熄灭状态
map.put(i, false);
}
for (int i = 1; i <= k; i++) {
//人的编号变化
for (int j = 1; j <= k; j++) {
//灯的编号变化
if (j % i == 0) {
map.put(j, !map.get(j));
}
}
}
List<Map.Entry<Integer, Boolean>> list = new ArrayList<>(map.entrySet());
List<Integer> list1 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
//获取灯亮的编号
if (list.get(i).getValue()) {
list1.add(list.get(i).getKey());
}
}
int[] nums = new int[list1.size()];//返回数组
for (int i = 0; i < nums.length; i++) {
nums[i] = list1.get(i);
}
return nums;
}
}
结果显示: