每日一题:1331. 数组序号转换

102 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

太久没有更文了,有些生疏

数组序号转换题目

[1331. 数组序号转换]【简单题】,难度还行,简单题就这diao样

审题

给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。

序号代表了一个元素有多大。序号编号的规则如下:

序号从 1 开始编号。 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。 每个数字的序号都应该尽可能地小。

由题目可知,这道题需要排序+哈希表来做,排序你可以采用冒泡排序、堆排序、选择排序、快速排序等来做,就一个目的为了排序而排序。只要排好序这道题就很简单了,我这边采用排完序后将数组保存,这一步有损失空间的不好的地方,我看题解是有可以规避这片空间的方法。hash表就很简单了,只要一一对应每一个数字所在的位置即可,我这里采用的是Hashmap,同事使用的是treemap,使用treemap的特性排好序也可以实现。不同思路不同解法。

编码

class Solution {
    public int[] arrayRankTransform(int[] arr) {
        int[] sortArr = Arrays.copyOf(arr, arr.length);
        Arrays.sort(sortArr);
        int[] ans = new int[arr.length];
        int index = 1;

        HashMap<Integer, Integer> match = new HashMap<>();

        for (int i = 0; i < sortArr.length; i++) {
            if (i != 0 && sortArr[i] == sortArr[i-1]) {
               match.put(sortArr[i], match.get(sortArr[i-1]));
            }else{
                match.put(sortArr[i], index++);
            }
        }

        for (int i = 0; i < arr.length; i++) {
            ans[i] = match.get(arr[i]);
        }

        return ans;
    }
}

耗时结果

image.png

总结

这道题是对比起他来说比较简单了,只要你在做题时想到hash表就能做,重点考察基本功这道题。讲个题外话,我同事说他可以用优先级队列做,我是没试过,大家有机会可以尝试一下别的方法。