假設您從
#include <unordered_set>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
const std::vector<int> numbers{50234, 50356, 50454, 50934};
您可以將其轉化爲一個字符串矢量:
std::vector<std::string> string_numbers;
std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); });
現在,我們將檢查所需的位數,從1:
size_t digits = 1;
while(true) {
在每次迭代中,我們將創建一個unordered_set
std::unordered_set<std::string> partials;
對於每個編號,我們會嘗試將它digits
數字進入設置:
for(const auto &s: string_numbers) {
if(s.size() <= digits) {
std::cout << "not unique" << std::endl;
return 0;
}
partials.insert(s.substr(0, digits));
}
如果集合的大小是矢量的大小,我們就大功告成了:
if(partials.size() == numbers.size()) {
std::cout << digits << " required" << std::endl;
return 0;
}
否則,我們需要增加的位數:
++digits;
}
}
全碼:
#include <unordered_set>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
const std::vector<int> numbers{50234, 50356, 50454, 50934};
std::vector<std::string> string_numbers;
std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); });
size_t digits = 1;
while(true) {
std::unordered_set<std::string> partials;
for(const auto &s: string_numbers) {
if(s.size() <= digits) {
std::cout << "not unique" << std::endl;
return 0;
}
partials.insert(s.substr(0, digits));
}
if(partials.size() == numbers.size()) {
std::cout << digits << " required" << std::endl;
return 0;
}
++digits;
}
}
難道你確實需要檢查整個號碼嗎? '502123456789'和'503123456789'從後面有很多相同的數字,但它們是不同的數字。 – NathanOliver
邏輯不邏輯 – Raindrop7
我是C++的新手,只是初學者。我不需要檢查整個號碼。我只是想讓它從後面到前面遍歷數字的每個位置。它可以丟棄沒有數字相似的數字,並且一旦到達沒有數字相似的數字的位置就停止。那有意義嗎? :/ – Mitrani