网易笔试-------数列重排

今天做了几道网易的历年笔试题,觉得题目不难,只不过就是有点坑,理解题意不对什么都是假的。考察的题都比较基础,主要是在有限的时间内完成8道题的题量,对于现阶段我自己的水平来说,我觉得有点困难,还是好好加油吧,熟能生巧嘛。

问题描述:
链接: https://www.nowcoder.com/questionTerminal/a461395335c946c5b409e79847796cd0
来源:牛客网

小易有一个长度为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

输入

2
3
1 10 100
4
1 2 3 4

输出

Yes
No
对于这样的题目,乍看不难,只不过判断相邻位置的数值相乘起来是否为4的倍数,首先,任何一个数和4的倍数的数相乘,结果肯定是4的倍数;其次,若存在任意数量的2的倍数的数,它们之间两两相乘的结果也是4的倍数;最后,我们只需判断4的倍数的数的个数、2的倍数的数的个数和奇数的个数分别是多少,然后再来做判断。

在4的倍数的数周围的数相乘起来都是4的倍数,在2的倍数的数的旁边需要站着4的倍数的数或者2的倍数的数,奇数的话则必须站在4的倍数的数的旁边。

1、如果2的倍数的数的个数大于0且4的倍数的数的个数大于等于奇数的个数,那么这个数列重排了之后肯定可以得到我们想要的结果,相邻位置的数值相乘为4的倍数;若不满足则返回No;

2、若2的倍数的数的个数小于0的话,则是判断4的倍数的数的个数是否大于等于(奇数的个数-1),若是,则输出“Yes";若不是,则输出”No”。
这道题中,为了得到最后输出的结果有许多“Yes”和“No“,我算是花费了很多心思,最后,想到弄一个flag[]z数组来标记所输入的不一样的数列是否满足题目的要求重排之后相邻位置的数相乘的结果为4的倍数。



具体代码如下:

import java.util.Scanner;

public class ShuLei {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int a[] = new int[n];
        int flag[] = new int[n];
        for (int i = 0; i < n; i++) {
            flag[i] = 0;
        }
        int mod4 = 0;
        int mod2 = 0;
        int odd = 0;
        for (int i = 0; i < n; i++) {
            a[i] = cin.nextInt();
            int b[] = new int[a[i]];
            for (int j = 0; j < a[i]; j++) {
                b[j] = cin.nextInt();
            }
            for (int j = 0; j < a[i]; j++) {
                if (b[j] % 4 == 0) {
                    mod4++;
                } else if (b[j] % 2 == 0) {
                    mod2++;
                } else {
                    odd++;
                }
            }
            if (mod2 > 0) {
                if (mod4 >= odd) {
                    flag[i]++;
                }
                //System.out.println("Yes");
                else {
                    //System.out.println("No");
                    flag[i] = 0;
                }
            } else {
                if (mod4 >= (odd - 1)) {
                    flag[i]++;
                    //System.out.println("Yes");
                } else {
                    flag[i] = 0;
                    //System.out.println("No");
                }
            }
        }
        for(int i = 0;i

你可能感兴趣的:(网易呀网易)