牛博士的是不是‘4’数列

173 阅读2分钟
原文链接: damobing.com

场景

小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]…, A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N – 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

输入描述

输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)

输出描述

对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。

输入例子1:
1 10 100

输出例子
yes

解题思路

首先绝对不要被逻辑绕进去,我们不用具体去排列,考虑怎么排,只要考虑如果队列符合要求,那么需要把什么数字来满足什么数字的需求。

简单分析之后 ,得到如下的三类数字。
1 不能被2整除也不能被4整除的,这种数必须有一个被4整除的紧邻才能符合要求
2 只能被2整除不能被4整除,这种有个特点就是连续的两个被2整除的排列时也能符合要求
3 能被4整除的,这种放在任何位置都是允许的

代码如下

let judgeFourArr=(arr)=>{
  let twoCount=0,zCount=0,fouCount=0,judge=false
  arr.map((ele,inex,arr)=>{
     if(ele%2==0&&ele%4!=0){
       twoCount++
     }else if(ele%4==0){
       fouCount++
     }else{
       zCount++
     }
  })
  if(fouCount+1>=(zCount+twoCount)||(fouCount>=zCount&&twoCount>=2)){
     judge=true
    }
   return judge?'yes':'no'
}