C# 计算字符串的变化

C# 计算字符串的变化,c#,permutation,variations,C#,Permutation,Variations,我有一系列错误编码的base36值-这些值是使用缺少“I”和“o”的字母字符串从整数编码而来的。现在需要将它们转换回整数(使用c#) 由于滚动效应,存在多个排列 “0”可以等于0或34 “1”可以等于1或35 例如,如果我有一个字符串“a110”,它有六个可能的值 我很难想出如何为此编写代码。 我看到的所有示例都有一组元素的变体:例如 char[]={a,b,c} int[]={1,2,3} 然而,在我的情况下,也涉及到一些条件,这让我头疼。有人能帮忙吗 您可以计算所有可能输入字符串的列表。首先

我有一系列错误编码的base36值-这些值是使用缺少“I”和“o”的字母字符串从整数编码而来的。现在需要将它们转换回整数(使用c#)

由于滚动效应,存在多个排列

“0”可以等于0或34 “1”可以等于1或35

例如,如果我有一个字符串“a110”,它有六个可能的值

我很难想出如何为此编写代码。 我看到的所有示例都有一组元素的变体:例如

char[]={a,b,c}

int[]={1,2,3}


然而,在我的情况下,也涉及到一些条件,这让我头疼。有人能帮忙吗

您可以计算所有可能输入字符串的列表。首先,将输入读入整数列表。现在,您知道其中的每一个(如果它是一个足够低的值)可能是两件事之一。因此,您可以创建一个枚举器,通过递归下降返回所有可能的输入。

我用下面的代码实现了这一点。它实际上比我预期的要简单一些,因为我只有两个条件和两个选项。它使用递归并逐步遍历字符串中的每个字符。如果该字符是0或1,则会发散,并继续构建字符串

它实际上生成了一些重复项,因此我必须添加一个条件,仅当它不存在时才将其添加到字符串列表中。如果有人能给我指出更好的逻辑,我将不胜感激

public string st = "101"; // hardcoded for now
public char[] cs;
public List<string> variations;

static void Main()
{
    cs = st.ToCharArray();
    variations = new List<string>();
    vary("",0);
}

static void vary(string m, int n)
{     
    for (int i = n; i < cs.Count(); i++)
    {
        if (cs[i] == '0' || cs[i] == '1')
        {
            // recurse
            combo(m + (cs[i] == '0' ? "0" : "1"), i + 1);
            combo(m + (cs[i] == '0' ? "Y" : "Z"), i + 1);
        }
        m += cs[i];
    }
    if(!variations.Contains(m))
        variations.Add(m);
}

转换是非唯一的,并且转换回可能涉及歧义,因此我怀疑这是否实际可用。
a110
实际上有8个可能的值:
10,1,1,0
10,1,1,34
10,1,35,0
10,1,35,34
10,35,1,0
10,35,1,34
10,35,35,34
。当然可以编写代码来给出所有可能的结果,但正如@David所说,它可能不会给您提供可用的结果。@David它可能没有实际用途,但它可能只是用来制作一个列表供人类检查,从而有人选择他们认为正确的结果。“我有一个数字意外地乘以了零。在乘法运算之前,我怎样才能找回我原来的数字?“你不能。数据中有冗余吗?这些值代表什么。例如,如果您有一篇英文文本,其中所有的
Y
Z
分别变成了
A
B
,您通常可以根据上下文猜测
A
的特定出现是否来自“真实的”
A
,或者从a
Y
@JeppeStigNielsen,我认为这与乘以0是不同的情况。数据没有错,只是弄错了。正确的答案就在一个相对较小(而且重要的)有限的可能性集合中的某个地方。
101
10Z
1Y1
1YZ
Z01
Z0Z
ZY1
ZYZ