#c# #algorithm #function #logic
#c# #алгоритм #функция #Логические
Вопрос:
У меня есть некоторая строка в таком формате
XXXX-XXXX-X_X_
Все «_» следует заменить буквами и цифрами, чтобы выполнить что-то подобное:
XXXX-XXXX-XAXA
XXXX-XXXX-XAXB
XXXX-XXXX-XAXC
XXXX-XXXX-XAXD
XXXX-XXXX-XAXE
XXXX-XXXX-XAXF
XXXX-XXXX-XAXG
(...)
XXXX-XXXX-XZX8
XXXX-XXXX-XZX9
XXXX-XXXX-X0XA
(...)
XXXX-XXXX-X2XA
XXXX-XXXX-X2XB
Я знаю, как сделать это с помощью одного «_».
string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";
foreach (char letter in alphaLetters.ToCharArray())
{
Numbers.Add(number.Replace('_', letter)));
}
Я хочу, чтобы этот код работал с неизвестным числом «_».
Вы можете помочь?
Комментарии:
1. @Dyppl — это коллекция сгенерированных строк.
2. @Hooch: Я пишу другое решение для решения вашей проблемы, как я ее вижу
3. Будет ли число os
_
одинаковым для всех чисел в коллекции Numbers?4. @Dyppl Ты не понимаешь. Numbers — это коллекция, которая содержит все сгенерированные коды. Существует только в коде с символами «_». Это тот, который используется в качестве шаблона.
5. Вам нужны все возможные комбинации? Например, если буквенные обозначения имеют длину 42 и у вас есть два
_
заполнителя, вы хотите 42 * 42 = 1764 комбинации?
Ответ №1:
ИМХО это должно быть рекурсивно. (Примечание: это не означает, что он должен использовать рекурсивный вызов метода, хотя я использовал рекурсивный вызов в следующем коде, его можно легко преобразовать во внутренний стек рекурсии. )
public static void RunSnippet()
{
var r = new List<string>();
Replace("asd_asd_asd_".ToCharArray(), 0, r);
foreach(var s in r) { Console.WriteLine(s); }
}
public static char[] possibilities = new char[] { 'A', 'B', 'C' };
public static void Replace(char[] chars, int startIndex, IList<string> result)
{
for (int i = startIndex; i < chars.Length; i )
{
if (chars[i] != '_')
{
continue;
}
// we found first '_'
for (int j = 0; j < possibilities.Length; j )
{
chars[i] = possibilities[j];
Replace(chars, i 1, result);
}
chars[i] = '_'; // take back what we replaced
return; //we're done here
}
// we didn't find any '_', so all were replaced and we have result:
result.Add(new string(chars));
}
Ответ №2:
Попробуйте этот:
var alphaIndexes = new List<int>();
string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";
for(int n = 0; n<Numbers.Count; n ) {
char[] numberLetters = Numbers[n].ToCharArray();
int position = 0;
for(int i = numberLetters.Length - 1; i>=0; i--) {
if(numberLetters[i] == '_') {
int alphaIndex = 0;
if(alphaIndexes.Count <= position)
alphaIndexes.Add(0);
else {
alphaIndex = alphaIndexes[position];
}
numberLetters[i] = alphaLetters[alphaIndex];
position ;
}
}
if(alphaIndexes.Count > 0) {
alphaIndexes[0] ;
for(int j = 0; j < alphaIndexes.Count; j ) {
if(alphaIndexes[j] >= alphaLetters.Length) {
alphaIndexes[j] = 0;
if (j < alphaIndexes.Count)
alphaIndexes[j 1] ;
}
}
}
Numbers[n] = new String(numberLetters);
Numbers[n].Dump();
}
Комментарии:
1. Но это может быть и не то, что вам нужно, извините, просто ваш вопрос не совсем ясен, сейчас я работаю над вашими разъяснениями