文章目录
- 前言
- 数组序号转换
- 检查整数及其两倍数是否存在
- 有多少小于当前数字的数字
- 上升下降字符串
- 找出数组中的幸运数
- 统计最大组的数目
前言
💫你好,我是辰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是一个无序集合,无法调用sortvector<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个0flag = 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;}
};