-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKata.cs
More file actions
86 lines (76 loc) · 2.83 KB
/
Copy pathKata.cs
File metadata and controls
86 lines (76 loc) · 2.83 KB
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
namespace DescendingOrder;
/// <summary>
/// Fournit une fonction permettant de réorganiser les chiffres
/// d'un entier non négatif dans l'ordre décroissant.
/// </summary>
public static class Kata
{
/// <summary>
/// Réorganise les chiffres d'un nombre entier non négatif
/// pour former le plus grand nombre possible.
/// </summary>
/// <param name="num">Nombre à traiter.</param>
/// <returns>
/// Un entier composé des mêmes chiffres que <paramref name="num"/>,
/// triés dans l'ordre décroissant.
/// </returns>
public static int DescendingOrder(int num)
{
// Cas trivial : si le nombre vaut 0, le résultat vaut aussi 0.
if (num == 0)
{
return 0;
}
// Tableau de comptage :
// l'indice représente le chiffre (0 à 9),
// la valeur représente le nombre d'occurrences de ce chiffre.
int[] digitCounts = new int[10];
// On extrait chaque chiffre du nombre avec les opérations
// modulo (%) et division entière (/).
while (num > 0)
{
int digit = num % 10; // Récupère le dernier chiffre.
digitCounts[digit]++; // Incrémente son compteur.
num /= 10; // Supprime le dernier chiffre.
}
int result = 0;
// On reconstruit ensuite le nombre final
// en parcourant les chiffres du plus grand au plus petit.
for (int digit = 9; digit >= 0; digit--)
{
// Tant qu'il reste des occurrences de ce chiffre,
// on l'ajoute à droite du résultat.
while (digitCounts[digit] > 0)
{
result = (result * 10) + digit;
digitCounts[digit]--;
}
}
return result;
}
/// <summary>
/// Réorganise les chiffres d'un nombre entier dans l'ordre décroissant
/// afin de produire le plus grand nombre possible.
/// </summary>
/// <param name="num">
/// Entier non négatif dont les chiffres doivent être triés.
/// </param>
/// <returns>
/// Un nouvel entier constitué des mêmes chiffres triés
/// du plus grand au plus petit.
/// </returns>
public static int DescendingOrderLinq(int num)
{
// Conversion du nombre en chaîne de caractères
// afin de manipuler chaque chiffre individuellement.
string digits = num.ToString();
// Tri des caractères (chiffres) dans l'ordre décroissant.
// OrderByDescending applique un tri LINQ.
var sortedDigits = digits
.OrderByDescending(c => c);
// Reconstruction d'une nouvelle chaîne à partir des chiffres triés.
string resultString = new(sortedDigits.ToArray());
// Conversion finale en entier.
return int.Parse(resultString);
}
}