Dans ce problème d'algorithmique, nous devons comparer deux chaînes de caractères représentent des numéros de version. Le point (.) sert de séparateur entre les segments numériques, et non de séparateur décimal. Par exemple, "2.5" indique la cinquième révision du second niveau de la seconde révision principale, et non une valeur décimale.
Un exemple d'ordonnancement valide : 0.1 < 1.1 < 1.2 < 13.37.
Analyce : La comparaison s'effectue segment par segment. Chaque segment est extrait et converti en entier pour une comparaison directe. Il est crucial de gérer les cas où les chaînes ont des longueurs différentes, comme 0.1 et 0.01, où 0.1 est supérieur à 0.01.
Voici plusieurs implémentations en C++ avec des approches variées :
Solution par parcours manuel
class Solution {
public:
int comparerVersions(string ver1, string ver2) {
int index1 = 0, index2 = 0;
while (index1 < ver1.size() || index2 < ver2.size()) {
int segment1 = 0, segment2 = 0;
while (index1 < ver1.size() && ver1[index1] != '.') {
segment1 = segment1 * 10 + (ver1[index1] - '0');
index1++;
}
while (index2 < ver2.size() && ver2[index2] != '.') {
segment2 = segment2 * 10 + (ver2[index2] - '0');
index2++;
}
if (segment1 > segment2) return 1;
if (segment1 < segment2) return -1;
index1++;
index2++;
}
return 0;
}
};
Solution utilisant des pointeurs et atoi
class Solution {
public:
int comparerVersions(string ch1, string ch2) {
const char* pointeur1 = ch1.c_str() - 1;
const char* pointeur2 = ch2.c_str() - 1;
do {
int val1 = 0, val2 = 0;
if (pointeur1) {
val1 = atoi(pointeur1 + 1);
pointeur1 = strchr(pointeur1 + 1, '.');
}
if (pointeur2) {
val2 = atoi(pointeur2 + 1);
pointeur2 = strchr(pointeur2 + 1, '.');
}
if (val1 < val2) return -1;
if (val1 > val2) return 1;
} while (pointeur1 || pointeur2);
return 0;
}
};
Solution avec stoi et substr
class Solution {
public:
int comparerVersions(string s1, string s2) {
int longueur1 = s1.length(), longueur2 = s2.length();
for (int i = 0, j = 0; i < longueur1 || j < longueur2; i++, j++) {
size_t position;
int partie1 = (i >= longueur1) ? 0 : stoi(s1.substr(i), &position);
i += position;
int partie2 = (j >= longueur2) ? 0 : stoi(s2.substr(j), &position);
j += position;
if (partie1 > partie2) return 1;
if (partie1 < partie2) return -1;
}
return 0;
}
};
Solution basée sur stringstream
class Solution {
public:
int comparerVersions(string version1, string version2) {
istringstream flux1(version1), flux2(version2);
string segment1, segment2;
while (!flux1.eof() || !flux2.eof()) {
getline(flux1, segment1, '.');
getline(flux2, segment2, '.');
int num1 = stoi(segment1.empty() ? "0" : segment1);
int num2 = stoi(segment2.empty() ? "0" : segment2);
if (num1 > num2) return 1;
if (num1 < num2) return -1;
segment1 = segment2 = "0";
}
return 0;
}
};