1

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

由于翻转效应,存在多个排列。

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

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

我很难弄清楚如何为此编写代码。我看过的所有示例都有一组元素的变体:例如。

字符[] = { a, b, c }

int[] = { 1, 2, 3 }

但是在我的情况下,也涉及条件,这让我很头疼。谁能帮忙?

4

2 回答 2

0

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

于 2013-04-09T16:56:04.667 回答
0

我设法用下面的代码做到了。它实际上比我预期的要简单一些,因为我只有两个条件和两个选项。它使用递归并逐步遍历字符串中的每个字符。如果该字符是 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);
}

对于字符串“101”,我得到以下组合

101
10Z
1Y1
1YZ
Z01
Z0Z
ZY1
ZYZ
于 2013-04-11T11:04:25.260 回答