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;

	}


}
posted @ 2021-01-06 17:06  BOTAK  阅读(92)  评论(0编辑  收藏  举报