给一个数,找出满足大于这个数,并且相邻每一位不相同的最小数,比如1121的解是1201,99的解是101
c++
#include <iostream>
#include <string>
std::string solve(int x) {
std::string s = std::to_string(x + 1);
int n = s.length();
for (int i = 0; i < n; ++i) {
for (char c = ' '; i < n && c != s[i]; ++i) {
c = s[i];
}
if (i == n) break;
std::string str = s.substr(0, i + 1);
int t = std::stoi(str) + 1;
n = str.length();
s.replace(s.begin(), s.begin() + i + 1, std::to_string(t));
}
bool zero = s[n-1] - '0';
for (int i = n; i < s.length(); ++i, zero = !zero) {
s[i] = zero ? '0' : '1';
}
return s;
}
int main() {
int x;
while (std::cin >> x) {
std::cout << solve(x) << "\n";
}
return 0;
}
c++
// 字符串版
#include <iostream>
#include <string>
#include <cassert>
std::string add(std::string s) {
int n = s.length();
assert(s.length() != 0);
if (s[0] == '-') {
if (s == "-1") return "0";
for (int i = n - 1; i >= 1; --i) {
if (s[i] != '0') {
s[i]--;
break;
}
s[i] = '9';
}
int k = 1;
while (s[k] == '0') k++;
return "-" + s.substr(k);
}
for (int i = n - 1; i >= 0; --i) {
if (s[i] != '9') {
s[i]++;
return s;
}
s[i] = '0';
}
return "1" + s;
}
std::string solve(std::string x) {
std::string s = add(x);
int n = s.length();
for (int i = 0; i < n; ++i) {
for (char c = ' '; i < n && c != s[i]; ++i) {
c = s[i];
}
if (i == n) break;
std::string str = s.substr(0, i + 1);
std::string t = add(str);
n = str.length();
s.replace(s.begin(), s.begin() + i + 1, t);
}
bool zero = s[n-1] - '0';
for (int i = n; i < s.length(); ++i, zero = !zero) {
s[i] = zero ? '0' : '1';
}
return s;
}
int main() {
std::string x;
while (std::cin >> x) {
std::cout << solve(x) << "\n";
}
return 0;
}
系统设计题,设计一个1000个玩家的游戏排行榜,要求满足高并发
c++
// 感觉在分块加锁,和效率之间应该还有不少的提升空间
#include <iostream>
#include <map>
#include <shared_mutex>
#include <vector>
#include <future>
#include <thread>
#include <chrono>
#include <random>
class Shard {
public:
void addOrUpdatePlayer(int playerId, int score) {
std::unique_lock<std::shared_mutex> lock(mtx);
auto it = playerToScore.find(playerId);
if (it != playerToScore.end()) {
scoreToPlayer.erase(scoreToPlayer.find(it->second));
}
playerToScore[playerId] = score;
scoreToPlayer.insert({score, playerId});
}
std::vector<std::pair<int, int>> getToPlayer(int topN) {
std::shared_lock<std::shared_mutex> lock(mtx);
std::vector<std::pair<int, int>> topPlayer;
auto it = scoreToPlayer.rbegin();
while (it != scoreToPlayer.rend() && topN > 0) {
topPlayer.emplace_back(it->second, it->first);
++it;
--topN;
}
return topPlayer;
}
private:
std::map<int, int> playerToScore;
std::multimap<int, int> scoreToPlayer;
std::shared_mutex mtx;
};
class GameRanking {
public:
GameRanking(int shardCount): shardCount(shardCount), shards(shardCount){ }
void addOrUpdatePlayer(int playerId, int score) {
int shardIndex = getShardIndex(playerId);
std::async(std::launch::async, [this, shardIndex, playerId, score](){
shards[shardIndex].addOrUpdatePlayer(playerId, score);
}).get();
}
std::vector<std::pair<int, int>> getTopPlayers(int topN) {
std::vector<std::future<std::vector<std::pair<int, int>>>> futures;
for (int i = 0; i < shardCount; ++i) {
futures.push_back(std::async(std::launch::async, [this, i, topN] {
return shards[i].getToPlayer(topN);
}));
}
std::vector<std::pair<int, int>> allTopPlayer;
for (auto & future : futures) {
auto shardTopPlayers = future.get();
allTopPlayer.insert(allTopPlayer.end(), shardTopPlayers.begin(), shardTopPlayers.end());
}
std::sort(allTopPlayer.begin(), allTopPlayer.end(), [] (const auto& a, const auto& b) {
return b.second < a.second;
});
if (allTopPlayer.size() > topN) {
allTopPlayer.resize(topN);
}
return allTopPlayer;
}
private:
int shardCount;
std::vector<Shard> shards;
int getShardIndex(int playerId) {
return playerId % shardCount;
}
};
int main() {
const int shardcount = 10;
const int playercount = 1000;
GameRanking ranking(shardcount);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 10000);
auto start = std::chrono::high_resolution_clock::now();
for (int i = 1; i <= playercount; ++i) {
int score = dis(gen);
ranking.addOrUpdatePlayer(i, score);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "time taken to add 1000 players: " << elapsed.count() << " seconds\n";
start = std::chrono::high_resolution_clock::now();
auto topplayers = ranking.getTopPlayers(10);
end = std::chrono::high_resolution_clock::now();
elapsed = end - start;
std::cout << "time taken to get top 10 players: " << elapsed.count() << " seconds\n";
for (const auto& player : topplayers) {
std::cout << "player id: " << player.first << ", score: " << player.second << std::endl;
}
return 0;
}
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB