Ограничение по времени: 1000 мс
Лимит памяти: 256M
Описание темы:
Светильников k, все фонари выключены, под фонарями стоят выключатели с номерами 1-k, есть k учеников с номерами 1-k, и они ходят под светом по очереди. количество огней, мимо которых они проходят, просто кратно их числу, затем дергают выключатель света (от выключения к включению, от включения к выключению) и спрашивают, какие огни горят в конце?
Введите описание:
к число
Описание выхода:
Количество всех включенных огней
намекать:
1<= к<=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;
}
}
Результаты показывают, что: