复试 || 就业day11(2024.01.07)算法篇

文章目录

  • 前言
  • 数组序号转换
  • 检查整数及其两倍数是否存在
  • 有多少小于当前数字的数字
  • 上升下降字符串
  • 找出数组中的幸运数
  • 统计最大组的数目

前言

你好,我是辰chen,本文旨在准备考研复试或就业
文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台
欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
仅给出C++版代码

以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:

ACM-ICPC算法汇总【基础篇】
ACM-ICPC算法汇总【提高篇】
AIoT(人工智能+物联网)
考研
CSP认证考试历年题解

数组序号转换


题目链接:数组序号转换

C++版AC代码:

class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        vector<int> res;
        if (arr.empty()) return res;      // 特判空,以免第9行代码报错
        vector<int> tmp = arr;
        sort(tmp.begin(), tmp.end());
        vector<int> unique;
        unique.push_back(tmp[0]);
        int cnt = 0;
        for (int i = 1; i < tmp.size(); i ++ ) 
            if (unique.empty() || unique[cnt] != tmp[i])
                unique.push_back(tmp[i]), cnt ++; // unique用来剔除重复元素,排序后的重复元素只能在一起
        unordered_map<int, int> m;
        for (int i = 0; i < unique.size(); i ++ ) m[unique[i]] = i + 1;
        for (int i = 0; i < arr.size(); i ++ ) res.push_back(m[arr[i]]);
        return res;
    }
};

C++版AC代码:

也可以使用 unordered_set 来对上述进行去重的处理,当然 unordered_setset 是无序集合,不支持排序,想要排序还需转回 vector

class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        unordered_set<int> s(arr.begin(), arr.end());
        // sort(s.begin(), s.end());     s是一个无序集合,无法调用sort
        vector<int> tmp(s.begin(), s.end());
        sort(tmp.begin(), tmp.end());
        unordered_map<int, int> m;
        for (int i = 0, j = 1; i < tmp.size(); i ++, j ++ )
            m[tmp[i]] = j;
        vector<int> res;
        for (int i = 0; i < arr.size(); i ++ ) res.push_back(m[arr[i]]);
        return res;
    }
};

检查整数及其两倍数是否存在


题目链接:检查整数及其两倍数是否存在

C++版AC代码:

class Solution {
public:
    bool checkIfExist(vector<int>& arr) {
        unordered_map<int, int> m;
        for (int i = 0; i < arr.size(); i ++ ) m[arr[i]] ++;
        bool flag = false;
        for (int i = 0; i < arr.size(); i ++ )
            if (m.count(arr[i] * 2)) {
                if (arr[i] == 0 && m[arr[i]] == 1) continue;  // 特判0,需要2个0
                flag = true;
                break;
            }
        return flag;
    }
};

有多少小于当前数字的数字


题目链接:有多少小于当前数字的数字

C++版AC代码:

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        unordered_map<int, int> m;
        vector<int> tmp = nums;
        sort(tmp.begin(), tmp.end());
        for (int i = 0; i < tmp.size(); i ++ ) {
            if (!m.count(tmp[i])) m[tmp[i]] = i;
        }
        vector<int> res;
        for (int i = 0; i < nums.size(); i ++ ) res.push_back(m[nums[i]]);
        return res;
    }
};

上升下降字符串


题目链接:上升下降字符串

C++版AC代码:

class Solution {
public:
    string sortString(string s) {
        int n = s.size();
        unordered_map<char, int> m;
        for (int i = 0; i < n; i ++ ) m[s[i]] ++;
        string res;
        while (n) {
            for (char c = 'a'; c <= 'z'; ++ c ) 
                if (m.find(c) != m.end() && m[c]) {
                    res += string(1, c);
                    m[c] --, n --;
                }
            for (char c = 'z'; c >= 'a'; -- c) 
                if (m.find(c) != m.end() && m[c]) {
                    res += string(1, c);
                    m[c] --, n --;
                }
        }
        return res;
    }
};

找出数组中的幸运数


题目链接:找出数组中的幸运数

C++版AC代码:

class Solution {
public:
    int findLucky(vector<int>& arr) {
        unordered_map<int, int> m;
        for (int i = 0; i < arr.size(); i ++ ) m[arr[i]] ++;
        int res = -1;
        for (auto i = m.begin(); i != m.end(); i ++ ) {
            int num = i -> first, cnt = i -> second;
            if (num == cnt) res = max(res, num);   // arr[i] >= 1,无需考虑负数
        }
        return res;
    }
};

统计最大组的数目


题目链接:统计最大组的数目

C++版AC代码:

class Solution {
public:
    int getacc(int n) {    // 计算数位和
        int acc = 0;
        while (n) {
            int k = n % 10;
            acc += k;
            n /= 10;
        }
        return acc;
    }
    int countLargestGroup(int n) {
        unordered_map<int, int> m;
        for (int i = 1; i <= n; i ++ ) m[getacc(i)] ++;
        int maxpart = 0;
        for (auto i = m.begin(); i != m.end(); i ++ ) // 找到数字数目最多的组
            maxpart = max(maxpart, i -> second);
        int res = 0;
        for (auto i = m.begin(); i != m.end(); i ++ ) // 统计数字数目最多的组的个数
            if (i -> second == maxpart) 
                res ++;
        return res;
    }
};

你可能感兴趣的:(考研,#,机试,力扣(LeetCode),算法,考研,机试,哈希,cpp,力扣)