LeetCode210515卡牌数组和按奇偶数组排序2

Posted 程序彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode210515卡牌数组和按奇偶数组排序2相关的知识,希望对你有一定的参考价值。

卡牌数组

思路:
声明一个计数数组,可统计出重复数的个数,索引下标即为当前数是几,存放出现重复的总次数。
将数组中出现的每个数的总次数放到list集合中。
// 当前长度对从2开始的数取模,如果是0,即8%2=0 8%3 8%4=0 8%5 8%6 8%7 8%8=0取模为0(2/4/8)的就是8的公约数。
当是公约数时,先默认为true,如果找到当前数不能整除从2开始的j,代表集合里有重复次数不同的数,直接返回false。

	public static boolean hasGroupsSizeX(int[] arr) {
        int n = arr.length;
        int[] count = new int[10000]; // 计数数组,可统计出重复数的个数,索引下标即为当前数是几,存放出现重复的总次数。
        for (int c: arr) {
            count[c]++;
        }
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10000; ++i) {
            if (count[i] > 0) {
                list.add(count[i]); // 将数组中出现的每个数的总次数放到list集合中
            }
        }
        for (int j = 2; j <= n; ++j) {
            if (n % j == 0) { // 当前长度对从2开始的数取模,如果是0,即8%2=0 8%3 8%4=0 8%5 8%6 8%7 8%8=0取模为0(2/4/8)的就是8的公约数
                boolean flag = true;
                for (int num: list) {
                    if (num % j != 0) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    return true;
                }
            }
        }
        return false;
    }

按奇偶数组排序2

法1:原地修改;维护偶数位置的i索引和奇数位置的j索引,j从1开始,i从0开始,如果a[i]对2取模为1,偶数索引上成奇数时,则判断奇数索引所指值是否是偶数,如果是奇数则步长为2走两步继续找偶数,否则,也就是找到了在奇数位置找到了偶数,就交换当前两指针所指值。
法2:两次遍历;复制出一个长度等同的新数组,遍历两次数组中的所有数,第一次找到所有偶数存放到下标为偶数的新数组中。第二次到所有奇数存放到下标为奇数的新数组中。

	public static int[] method(int[] a){
        int j =1;
        int n = a.length;
        for (int i = 0; i < n; i+=2) {
            if (a[i] % 2 == 1) {
                while (a[j] % 2 == 1) {
                    j+=2;
                }
                swap(i,j,a);
            }
        }
        return a;
    }

    private static void swap(int i, int j, int[] a) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    public static int[] method2(int[] a){

        int n = a.length;
        int[] copyArr = new int[n];
        int i = 0;
        for (int num : a) {
            if (num % 2 == 0) {
                copyArr[i] = num;
                i+=2;
            }
        }

        int j = 1;
        for (int num : a) {
            if (num % 2 == 1) {
                copyArr[j] = num;
                j+=2;
            }
        }
        return copyArr;
    }

以上是关于LeetCode210515卡牌数组和按奇偶数组排序2的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 记录

LeetCode#905 - 按奇偶排序数组

leetcode922----按奇偶排序数组

leetcode922----按奇偶排序数组

leetcode922. 按奇偶排序数组Ⅱ

LeetCode 0905「按奇偶排序数组」