我想创建一个函数,列出首先按长度排序然后按字母顺序排序的字符串。我试着像
那样做 public static string nextstring(string s) {
String next = ((char)(s[0] + 1)).ToString();
return next;
}
但是如何修改代码以使其适用于更长的字符串?我的目标是按顺序打印所有字符串,如a,b,c,...,z,aa,ab,ac,...,az,ba,...,zz,aaa ......
答案 0 :(得分:2)
首先,考虑增加十进制数的算法:
1
你的字符串可以被认为是base-26系统中的数字,略有扭曲(没有零)。你从最后一个字母的增量开始;如果结果超过'z'
,请返回'a'
,然后转到下一个字母;如果您用尽所有字母,请在值前插入'a'
。
以下是此方法的一种可能实现方式:
static string Increment(string s) {
var chars = s.ToCharArray();
int carry = 1;
var i = s.Length-1;
while (i >= 0) {
chars[i] += (char)carry;
if (chars[i] <= 'z') {
carry = 0;
break;
}
chars[i] = 'a';
carry = 1;
i--;
}
var res = new string(chars);
return (i == -1 && carry != 0) ? "a"+res : res;
}
答案 1 :(得分:0)
如果我没有误解你的请求,你正在寻找的是一个有序递增的字符序列,这个实现应该产生你想要的东西:
private static List<String> CharCombos(Int32 maximumSize)
{
const String alphabet = "abcdefghijklmnopqrstuvwxyz";
IEnumerable<String> projection = alphabet.Select(x => x.ToString()).ToList();
List<String> result = new List<String>(projection);
for (Int32 j = 1; j < maximumSize; ++j)
{
projection = projection.SelectMany(x => alphabet, (x, y) => x + y);
result.AddRange(projection);
}
return result;
}
以下代码:
foreach (String combo in CharCombos(3))
Console.WriteLine(combo);
将产生:
a
b
...
y
z
aa
ab
...
zy
zz
aaa
aab
...
zzy
zzz
您可以看到一个有效的例子here。我知道这会改变你当前实现的逻辑,提出一种新的方法,而不是正确地修改现有的方法,但我希望你无论如何都能欣赏它。
答案 2 :(得分:0)
请尝试以下操作。
string SingleEntry(int number)
{
char[] array = " ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray();
Stack<string> entry = new Stack<string>();
List<string> list = new List<string>();
int bas = 26;
int remainder = number, index = 0;
do
{
if ((remainder % bas) == 0)
{
index = bas;
remainder--;
}
else
index = remainder % bas;
entry.Push(array[index].ToString());
remainder = remainder / bas;
}
while (remainder != 0);
string s = "";
while (entry.Count > 0)
{
s += entry.Pop();
}
return s;
}