💫你好,我是辰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;
}
};