如何制作字符串的下一步.C#

Geo*_*rge 6 c# string ascii char

问题很复杂,但我会详细解释.

目标是创建一个函数,它将返回给定字符串的下一个"步骤".

例如

String.Step("a"); //  = "b"
String.Step("b"); //  = "c"
String.Step("g"); //  = "h"
String.Step("z"); // = "A"
String.Step("A"); // = "B"
String.Step("B"); // = "C"
String.Step("G"); // = "H"
Run Code Online (Sandbox Code Playgroud)

直到这里它很容易,但考虑到输入IS字符串它可以包含多于1个字符,并且该函数必须像这样.

String.Step("Z"); // = "aa";
String.Step("aa"); // = "ab";
String.Step("ag"); // = "ah";
String.Step("az"); // = "aA";
String.Step("aA"); // = "aB";
String.Step("aZ"); // = "ba"; 
String.Step("ZZ"); // = "aaa";
Run Code Online (Sandbox Code Playgroud)

等等...

这并不需要扩展基类String类.

我试图通过每个字符的ASCII值来解决这个问题,但是却遇到了包含2个字符的字符串.

如果有人能提供该功能的完整代码,我将非常感激.

提前致谢.

编辑 *对不起我之前忘了提到函数"重新分析"自生成的字符串,当它的长度达到n时.

continuation of this function will be smth like this. for example n = 3
String.Step("aaa"); // = "aab";
String.Step("aaZ"); // = "aba";
String.Step("aba"); // = "abb";
String.Step("abb"); // = "abc";
String.Step("abZ"); // = "aca";
.....
String.Step("zzZ"); // = "zAa";
String.Step("zAa"); // = "zAb";
........
Run Code Online (Sandbox Code Playgroud)

对不起我之前没有提到它,在读完一些答案之后我意识到这个问题有问题.

如果没有这个,该功能将始终在步骤结束后产生n次字符"a" .

Dar*_*mas 11

注意:这个答案是不正确的,因为"a"应该在"Z"之后......(见下面的评论)

这是一个可能有效的算法:

每个"字符串"表示给定基数的数字(此处:字母表中字母数的两倍).

因此,可以通过将"number"-string解析回int,添加1然后将其格式化回基数来计算下一步.

例:

"a" == 1 -> step("a") == step(1) == 1 + 1 == 2 == "b"
Run Code Online (Sandbox Code Playgroud)

现在,您的问题被简化为将字符串解析为给定基数的数字并重新格式化.一个快速的谷歌搜索建议此页面:http://everything2.com/title/convert+any+number+to+decimal

怎么实现这个?

  • 字母到其对应编号的查找表:a = 1,b = 2,c = 3,... Y =?,Z = 0
  • 要将字符串解析为数字,请按相反顺序读取字符,查找数字并将其相加:
    • "ab" - > 2*BASE ^ 0 + 1*BASE ^ 1
    • BASE是"数字"的数量(字母表中的2个字母数,是48个?)

编辑:这个链接看起来更有希望:http://www.citidel.org/bitstream/10117/20/12/convexp.html


Ant*_*nes 5

相当多的方法,这是我的: -

功能:

private static string IncrementString(string s)
{
  byte[] vals = System.Text.Encoding.ASCII.GetBytes(s);
  for (var i = vals.Length - 1; i >= 0; i--)
  {
    if (vals[i] < 90)
    {
      vals[i] += 1;
      break;
    }
    if (vals[i] == 90)
    {
      if (i != 0)
      {
        vals[i] = 97;
        continue;
      }
      else
      {
        return new String('a', vals.Length + 1); 
      }
    }

    if (vals[i] < 122)
    {
      vals[i] += 1;
      break;
    }

    vals[i] = 65;
    break;
  }

  return System.Text.Encoding.ASCII.GetString(vals);
}
Run Code Online (Sandbox Code Playgroud)

测试

Console.WriteLine(IncrementString("a") == "b");
Console.WriteLine(IncrementString("z") == "A");
Console.WriteLine(IncrementString("Z") == "aa");
Console.WriteLine(IncrementString("aa") == "ab");
Console.WriteLine(IncrementString("az") == "aA");
Console.WriteLine(IncrementString("aZ") == "ba");
Console.WriteLine(IncrementString("zZ") == "Aa");
Console.WriteLine(IncrementString("Za") == "Zb");
Console.WriteLine(IncrementString("ZZ") == "aaa");
Run Code Online (Sandbox Code Playgroud)