所以,我正在尝试这样做:(示例)
a,b,c,d.. 等 aa,ab,ac.. 等 ba,bb,bc 等
因此,这基本上可以解释为通常增加并且仅打印所有可能的变化,从 a 开始。到目前为止,我已经能够用一封信做到这一点,开始是这样的:
for (int i = 97; i <= 122; i++)
{
item = (char)i
}
但是,我最终无法添加第二个字母、第三个字母等等。有人可以提供输入吗?谢谢。
所以,我正在尝试这样做:(示例)
a,b,c,d.. 等 aa,ab,ac.. 等 ba,bb,bc 等
因此,这基本上可以解释为通常增加并且仅打印所有可能的变化,从 a 开始。到目前为止,我已经能够用一封信做到这一点,开始是这样的:
for (int i = 97; i <= 122; i++)
{
item = (char)i
}
但是,我最终无法添加第二个字母、第三个字母等等。有人可以提供输入吗?谢谢。
由于到目前为止还没有一个可以真正“增加字符串”的解决方案,所以这里有一个解决方案:
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'
你的 for 循环的每次迭代都完全覆盖了“item”中的内容 - for 循环一次只分配一个字符“i”
如果 item 是字符串,请使用以下内容:
item = "";
for (int i = 97; i <= 122; i++)
{
item += (char)i;
}
影响的东西
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 是更好的选择。所以您可能需要考虑使用它而不是字符串连接。
另一种看待这个问题的方法是你想以 26 为底数。计算机非常擅长计数,因为它总是必须从它存储值的方式以 2 为底(二进制)转换为以 10 为底(十进制--你和我通常认为的数字系统),转换为不同的数字基数也很容易。
这里有一个通用的基础转换器https://stackoverflow.com/a/3265796/351385,它将字节数组转换为任意基础。一旦您对数字基数有了很好的理解并且可以理解该代码,创建一个以二进制计数但转换为以 26 为基数进行显示的以 26 为基数的计数器就很简单了。