Bootstrap

数组变换(两倍)

数组变换

在这里插入图片描述

在这里插入图片描述
以最大元素为基准元素,判读其他元素能否通过 x 2 成为最大值!

那么怎么判断呢:

  1. max % arr[i] == 0
  2. arr[i] * 2 ^n == max
    int x = 2 ^ n == max / arr[i]
    3.只需判断 这个 x 是不是 2 的 n 次放就可以了!

判断 是否为 2 的 n 次 (位运算):

对于一个 2 的 n 次方的数,它在二进制表示下只有一个位是 1,其余位都是 0。例如,2(二进制为 10)、4(二进制为 100)、8(二进制为 1000)等。
当我们对一个 2 的 n 次方的数 n 进行 n & (n - 1) 操作时,结果为 0。这是因为 n - 1 的二进制表示就是将 n 的二进制表示中唯一的那个 1 变成 0,然后其后的所有 0 都变成 1。例如,8(二进制 1000),7(二进制 0111),它们进行按位与操作 1000 & 0111 结果就是 0。而如果一个数不是 2 的 n 次方,那么它的二进制表示中不止一个 1,进行 n & (n - 1) 操作就不会得到 0。

public class PowerOfTwoChecker {
    public static boolean isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        return (n & (n - 1)) == 0;
    }
}
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] a = new int[n];
        int max = 0 ;
        for(int i = 0; i < n; i++) {
            a[i] = in.nextInt();
            max = Math.max(max,a[i]);
        }
        boolean flag = true;
        for(int i = 0 ; i < n; i++) {
            if(max % a[i] != 0) {
                flag = false;
                break;
            }
            int x = max / a[i];
            if((x & (x - 1)) != 0) {
                flag = false;
                break;
            }
        }
        if(flag) System.out.println("YES");
        else System.out.println("NO");
    }
}
;