1

所以,我正在尝试这样做:(示例)

a,b,c,d.. 等 aa,ab,ac.. 等 ba,bb,bc 等

因此,这基本上可以解释为通常增加并且仅打印所有可能的变化,从 a 开始。到目前为止,我已经能够用一封信做到这一点,开始是这样的:

for (int i = 97; i <= 122; i++)
{
    item = (char)i
}

但是,我最终无法添加第二个字母、第三个字母等等。有人可以提供输入吗?谢谢。

4

4 回答 4

2

由于到目前为止还没有一个可以真正“增加字符串”的解决方案,所以这里有一个解决方案:

static string Increment(string s) {
    if (s.All(c => c == 'z')) {
        return new string('a', s.Length + 1);
    }
    var res = s.ToCharArray();
    var pos = res.Length - 1;
    do {
        if (res[pos] != 'z') {
            res[pos]++;
            break;
        }
        res[pos--] = 'a';
    } while (true);
    return new string(res);
}

这个想法很简单:假设字母是你的数字,并按照他们在小学的教学方式进行增量。从最右边的“数字”开始,然后递增。如果您击中 9('z'在我们的系统中),请移至前一个数字;否则,你就完成了递增。

明显的特殊情况是“数字”完全由九组成。这是您的“计数器”需要滚动到下一个尺寸并添加“数字”的时候。在方法的开头检查这个特殊条件:如果字符串由N字母组成,则返回一个字母s'z'的字符串。N+1'a'

这是ideone 上此代码的快速演示的链接

于 2012-07-09T21:24:40.010 回答
0

你的 for 循环的每次迭代都完全覆盖了“item”中的内容 - for 循环一次只分配一个字符“i”

如果 item 是字符串,请使用以下内容:

item = "";
for (int i = 97; i <= 122; i++)
{
  item += (char)i;
}
于 2012-07-09T20:47:28.453 回答
0

影响的东西

public string IncrementString(string value)
{
    if (string.IsNullOrEmpty(value)) return "a";

    var chars = value.ToArray();
    var last = chars.Last();

    if(char.ToByte() == 122)
    return value + "a";

    return value.SubString(0, value.Length) + (char)(char.ToByte()+1);
}

您可能需要将字符转换为字节。可以将其封装在扩展方法中,例如static int ToByte(this char)

在构建大量字符串时,StringBuilder 是更好的选择。所以您可能需要考虑使用它而不是字符串连接。

于 2012-07-09T20:49:48.263 回答
0

另一种看待这个问题的方法是你想以 26 为底数。计算机非常擅长计数,因为它总是必须从它存储值的方式以 2 为底(二进制)转换为以 10 为底(十进制--你和我通常认为的数字系统),转换为不同的数字基数也很容易。

这里有一个通用的基础转换器https://stackoverflow.com/a/3265796/351385,它将字节数组转换为任意基础。一旦您对数字基数有了很好的理解并且可以理解该代码,创建一个以二进制计数但转换为以 26 为基数进行显示的以 26 为基数的计数器就很简单了。

于 2012-07-09T21:53:31.970 回答