坚持不懈,越努力越幸运,大家一起学习鸭~~~

【教3妹学算法-每日1题】采集果实_算法

3妹:2哥,听说武汉某高校有霍乱,霍乱是什么啊?
2哥:霍乱是因摄入的食物或水受到霍乱弧菌污染而引起的一种急性腹泻性传染病。每年,估计有300万~500万霍乱病例,另有10万~12万人死亡。病发高峰期在夏季,能在数小时内造成腹泻脱水甚至死亡。
3妹:啊, 这么严重。
2哥:不要恐慌,目前武汉也只有一例,并且这个病的死亡核概率还是很小的。
3妹:那怎样避免霍乱呢?
2哥:普通人,要做到勤洗手,吃熟食, 不吃生的东西,不要去不干净的路边摊吃东西。
3妹:啊, 我还想去路边吃烧烤呢,看来还是算了吧。
2哥:3妹就知道吃,还是在家好好学习吧。

【教3妹学算法-每日1题】采集果实_算法_02

题目:

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

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

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

示例 1:

输入:arr = [40,10,20,30]
输出:[4,1,2,3]
解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。
示例 2:

输入:arr = [100,100,100]
输出:[1,1,1]
解释:所有元素有相同的序号。
示例 3:

输入:arr = [37,12,28,9,100,56,80,5,12]
输出:[5,3,4,2,8,6,7,1,3]

提示:

0 <= arr.length <= 105
-109 <= arr[i] <= 109

java代码:

class Solution {
    public int[] arrayRankTransform(int[] arr) {

        int n = arr.length;
        int[] expired = new int[n];
        System.arraycopy(arr, 0, expired, 0, n);

        Arrays.sort(expired);
        Map<Integer, Integer> map = new HashMap<>();
        int i = 1;
        for (int num : expired) {
            if (!map.containsKey(num)) {
                map.put(num, i++);
            }
        }

        int[] res = new int[n];
        int j = 0;
        for (int num : arr) {
            res[j++] = map.get(num);
        }

        return res;
    }
}