GG

5730. 将所有数字用字符替换

简单模拟题目

1
2
3
4
5
6
7
8
9
class Solution {
public:
string replaceDigits(string s) {
for(int i=0;i<s.size(); i+=2) {
s[i+1] = s[i]+(s[i+1]-'0');
}
return s;
}
};

5731. 座位预约管理系统

数据结构题, 维护一个set就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SeatManager {
set<int> s;
public:
SeatManager(int n) {
s.clear();
for(int i=1;i<=n;i++) s.insert(i);
}

int reserve() {
int mn = *s.begin();
s.erase(mn);
return mn;
}

void unreserve(int x) {
s.insert(x);
}
};

5732. 减小和重新排列数组后的最大元素

开始想都没想就搞二分了。。。搞了半天

后面发现只要拍个序 模拟一下就好了, 如果这个一个减上一个超过1, 就变成上一个的值+1.

没看到题目说 第一个 必须为 1 wa了一发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int maximumElementAfterDecrementingAndRearranging(vector<int>& arr) {
int n = arr.size();
sort(arr.begin(), arr.end());
arr[0]=1;
for(int i=1;i<arr.size();i++) {
if(arr[i] > arr[i-1]+1) {
arr[i] = arr[i-1]+1;
}
}

return arr[n-1];
}
};

5733. 最近的房间

这个题本身也不难, 数据和查询两个数组按照size从大到小拍个序就好了。 搞个set维护roomId。 set自带的二分查找下就行了。 因为是绝对值就再维护个负值的set(后面看了其他大佬的代码发现迭代器减一下就行了)。

不太会用set, 不会写c++的匿名函数,, 后面判断逻辑又少了, GG。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool cmp(vector<int>& a, vector<int>& b) {
return a[1] > b[1];
}

class Solution {
public:
vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& q) {
vector<int> ans(q.size());

for(int i = 0; i<q.size(); i++) {
q[i].push_back(i);
ans[i] = -1;
}
sort(rooms.begin(), rooms.end(), cmp);
sort(q.begin(), q.end(), cmp);

int p = 0,as,asf;
set<int> s, sf;

for(auto& qq: q) {
for(;p<rooms.size() && rooms[p][1] >= qq[1]; p++) {
s.insert(rooms[p][0]);
sf.insert(-rooms[p][0]);
}

as = asf = -1;
auto it = s.lower_bound(qq[0]);
if(it!=s.end()) {
as = (*it) - qq[0];
ans[qq[2]] = (*it);
}

auto it2 = sf.lower_bound(-qq[0]);
if(it2 != sf.end()) {
asf = (*it2) - (-qq[0]);
if(ans[qq[2]] == -1 || asf <= as) ans[qq[2]] = -(*it2);
}
}

return ans;
}
};