Q03 翻牌
Q03 翻牌
这里有 100 张写着数字 1~100 的牌,并按顺序排列着。最开始所有牌都是背面朝上放置。某人从第 2 张牌开始,隔 1 张牌翻牌。然后第 2, 4, 6, …, 100 张牌就会变成正面朝上。接下来,另一个人从第 3 张牌开始,隔 2 张牌翻牌(原本背面朝上的,翻转成正面朝上;原本正面朝上的,翻转成背面朝上)。再接下来,又有一个人从第 4 张牌开始,隔 3 张牌翻牌。像这样,从第 n 张牌开始,每隔 n-1 张牌翻牌,直到没有可翻动的牌为止。
求当所有牌不再变动时,所有背面朝上的牌的数字。
import java.util.*;
class Solution{
public static void main(String[] args) {
System.out.println(reverseCard());
System.out.println(reverseCard2());
}
public static ArrayList<Integer> reverseCard(){
ArrayList<Integer> res = new ArrayList<>();
// 模拟卡片 其中false代表背面朝上 true代表正面朝上
boolean[] cards = new boolean[100];
// 模拟从第几个开始
for(int i = 2;i<=cards.length;i++){
// j代表每隔多少个进行反转
int j=i-1;
while(j<cards.length){
cards[j] = !cards[j];
j+=i;
}
}
for(int i = 0;i<cards.length;i++) if(cards[i] == false) res.add(i+1);
return res;
}
/**
这个问题等价于“寻找被翻转次数为偶数的牌”。而翻牌操作的时机则是“翻牌间隔数字是这个数的约数时”,因此也就相当于寻找拥有偶数个“1 以外的约数”的数字。
只有当牌面数字是平方数的时候约数才是奇数个.
16 的约数是 "1、2、4、8、16" 这 5 个,也就是奇数个
12 的约数是“1、2、3、4、6、12”这 6 个
*/
public static ArrayList<Integer> reverseCard2(){
ArrayList<Integer> res = new ArrayList<>();
for(int i = 1;i<=100;i++){
double a = Math.sqrt(i);
int b = (int) a;
if(a - b == 0) res.add(i);
}
return res;
}
}
Saying Less Doing More