代码之家  ›  专栏  ›  技术社区  ›  roryok

计算字符串的变化

  •  1
  • roryok  · 技术社区  · 12 年前

    我有一系列编码错误的base36值——这些值是用一个字母串从整数编码的,缺少“I”和“o”。现在需要使用C#将它们转换回整数。

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

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

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

    我很难弄清楚如何为此编写代码。 例如,我看过的所有例子都计算了一组元素的变化

    char[] = { a, b, c }
    int[] = { 1, 2, 3 }
    

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

    2 回复  |  直到 3 年前
        1
  •  0
  •   redtuna    12 年前

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

        2
  •  0
  •   roryok    12 年前

    我用下面的代码成功地做到了。事实上,这比我预期的要简单一点,因为我只有两个条件和两个选择。它使用递归和逐步遍历字符串中的每个字符。如果该字符是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