用LeetCode复习Java基本语法(题号1054)

Hello Java.

题目描述:
在一个仓库里,有一排条形码,其中第i个条形码为barcodes[i]。
请你重新排列这些条形码,使其中两个相邻的条形码不能相等。你可以返回任何满足该要求的答案,此题保证存在答案。

示例:
输入:[1,1,1,2,2,2]
输出:[2,1,2,1,2,1]

输入:[1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]

提示:
1 <= barcodes.length <= 10000
1 <= barcodes[i] <= 10000

题目链接:
https://leetcode-cn.com/problems/distant-barcodes/

代码:

class Solution {
    public int[] rearrangeBarcodes(int[] barcodes) {
        /* 入参判断 */
        if(null == barcodes || barcodes.length == 0) {
            return barcodes;
        }
        /* 统计次数 */
        int len = barcodes.length;
        int[] cnt = new int[10001];
        for(int i = 0; i < len; i++) {
            cnt[barcodes[i]]++;
        }
        /* 找出出现次数最多的 */
        int maxCnt = 0;
        int maxNum = 0;
        for(int i = 0; i < 10001; i++) {
            if(cnt[i] > maxCnt) {
                maxCnt = cnt[i];
                maxNum = i;
            }
        }
        /* 次数最多的先填充奇数位 */
        int[] res = new int[len];
        int pos = 0;
        int idx = 0;
        while(pos < len) {
            if(cnt[maxNum] <= 0) {
                break;
            }
            else {
                cnt[maxNum]--;
                res[pos] = maxNum;
                pos += 2;
            }
        }
        /* 填充其余奇数位 */
        while(pos < len) {
            if(cnt[idx] <= 0) {
                idx++;
                continue;
            }
            else {
                cnt[idx]--;
                res[pos] = idx;
                pos += 2;
            }
        }
        /* 填充偶数位 */
        pos = 1;
        while(pos < len) {
            if(cnt[idx] <= 0) {
                idx++;
                continue;
            }
            else {
                cnt[idx]--;
                res[pos] = idx;
                pos += 2;
            }
        }
        return res;
    }
}

还有更为简洁的一个版本:

class Solution {
    public int[] rearrangeBarcodes(int[] barcodes) {
        /* 统计次数并保存次数最多的 */
        int[] cnt = new int[10001];
        int max = 0;
        for(int i : barcodes) {
            cnt[i]++;
            if(cnt[i] > cnt[max]) {
                max = i;
            }
        }
        /* 先填充次数最多的数 */
        int[] res = new int[barcodes.length];
        int idx = 0;
        for(int i = 0; i < cnt[max]; i++) {
            res[idx] = max;
            idx += 2;
        }
        cnt[max] = 0;
        /* 填充剩余数字 */
        for(int i = 0; i < 10001;) {
            if(cnt[i] == 0) {
                i++;
                continue;
            }
            if(idx >= barcodes.length) {
                idx = 1;
            }
            res[idx] = i;
            cnt[i]--;
            idx += 2;
        }
        return res;
    }
}

Java中的Map

  • Map是Java中一种常见的集合类,包含了HashMap、TreeMap、HashTable、LinkedHashMap等
  • Map中的集合不能包含重复的键,但是对应值可以重复,每个键只能对应一个值
  • 常用方法:get,put,remove,keySet(返回映射关系中键的Set视图)等
  • 遍历Map的方法是,通过keySet方法,利用Iterator迭代器进行遍历
  • 参考资料:Java笔记-Map的用法
  • 参考资料:详解Java中Map的用法
  • 参考资料:JavaMap集合深入学习
  • 学习资料:Java容器:Map

待续ヾ(=・ω・=)o

你可能感兴趣的:(JAVA)