通过循环旋转将值从AAA增加到ZZZ

fxk*_*kim 10 c# increment

我需要编写一个方法,通过循环旋转将字符串值从AAA递增到ZZZ(ZZZ之后的下一个值是AAA)

这是我的代码:

    public static string IncrementValue(string value) {
        if (string.IsNullOrEmpty(value) || value.Length != 3) {
            string msg = string.Format("Incorrect value ('{0}' is not between AAA and ZZZ)", value);
            throw new ApplicationException(msg);
        }
        if (value == "ZZZ") {
            return "AAA";
        }
        char pos1 = value[0];
        char pos2 = value[1];
        char pos3 = value[2];

        bool incrementPos2 = false;
        bool incrementPos1 = false;

        if (pos3 == 'Z') {
            pos3 = 'A';
            incrementPos2 = true;
        } else {
            pos3++;
        }

        if (incrementPos2 && pos2 == 'Z') {
            pos2 = 'A';
            incrementPos1 = true;
        } else {
            if (incrementPos2) {
                if (pos2 == 'Z') {
                    pos2 = 'A';
                    incrementPos1 = true;
                }
                pos2++;
            }
        }

        if (incrementPos1) {
            pos1++;
        }

        return pos1.ToString() + pos2.ToString() + pos3.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

我知道这段代码很脏而且不是很有效但我不知道如何正确地做到这一点.

如何保护这个片段?(这只会在Windows平台上运行)

我如何优化它并使其更具可读性?

感谢您的意见

Hei*_*nzi 19

用数学的方式考虑一下:你的字符串(AAA,AAB,......)的行为就像自然数字(000,001,...),除了基数为26而不是基数为10.

所以,你可以使用相同的原则.这是一些代码:

// iterate cyclicly from 0 to 26^3 - 1
int incrementValue(int i) {
    // a verbose way of writing "return (i + 1) % 26^3"
    i++;
    if (i == 26*26*26) i = 0;
    return i;
}

// convert 0 to AAA, 1 to AAB, ...
string formatValue(int i) {
    var result = new StringBuilder();

    result.Insert(0, (char)('A' + (i % 26)));
    i /= 26;
    result.Insert(0, (char)('A' + (i % 26)));
    i /= 26;
    result.Insert(0, (char)('A' + (i % 26)));

    return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)


mea*_*gar 11

也许我错过了一些东西,但我认为这个相当简单的解决方案可行,而不仅仅是三位数字; 任何仲裁长度基数26都可以递增.它将根据问题从ZZZZ换行到AAAA,而不是从ZZZZ"正确"递增到AAAAA.

// Increment a base 26 number (composed of "digits" A..Z), wrapping around
// from ZZZ... to AAA...
string increment(string str) {        
  char[] digits = str.ToCharArray();

  for (int i = str.length - 1; i >= 0; --i) {
    if (digits[i] == 'Z') {
      digits[i] = 'A';
    } else {
      digits[i] += 1;
      break;
    }
  }
  return new string(digits);
}
Run Code Online (Sandbox Code Playgroud)

  • +1,这是我们在幼儿园学到的"添加"算法的一个很好而紧凑的算法概括.BTW:将i修复为3将允许你在方法的开头删除`if`并导致"自然"环绕. (2认同)