我遇到以下算法的逻辑问题:
比较字母数字“逐个字母”,以“字母”的顺序,按升序排列:
0123456789A...Z
示例结果:
- V123> A789 =真(因为V> A)
- AB123CD> 12DEF56 = true(因为A> 1)
- AB> DE =假(因为A< D)
- A1B2> A123 =真(因为B> 2)
- X2Y3> X1Y5 =假(因为3 <5)
- AB10&gt; AA23 =真(因为B> A)
- VA20C&gt; VB10C =假(因为A&lt; B)
订单必须是可编辑的,以便您可以更改A&gt; Z某天,或9> B等。
我当前的算法适用于大多数测试用例,但示例中的算法仍然给我带来麻烦 - 算法将它们报告为不匹配,实际上它们应匹配。
private static string _customAlphanumericOrder = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static bool Matches(string left_, string right_)
{
int maxLength = Math.Max(left_.Length, right_.Length);
left_ = left_.PadRight(maxLength, '0').ToUpperInvariant();
right_ = right_.PadRight(maxLength, '0').ToUpperInvariant();
for (int index = 0; index < maxLength; index++) {
int leftOrderPosition = _customAlphanumericOrder.IndexOf(left_[index]);
int rightOrderPosition = _customAlphanumericOrder.IndexOf(right_[index]);
if (leftOrderPosition > rightOrderPosition) {
return true;
}
}
return false;
}
我知道我的错在某个地方,因为我过早地中止了算法,但是我无法解决如何将前面的字母结果“结转”到下一个字母的结果。
我怎样才能解开这个?
答案 0 :(得分:1)
如果return false;
,您还应立即leftOrderPosition < rightOrderPosition
。
只有在他们平等的情况下才能继续。
答案 1 :(得分:1)
我想我会像这样更新算法(参见添加的if):
private static string _customAlphanumericOrder = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static bool Matches(string left_, string right_)
{
int maxLength = Math.Max(left_.Length, right_.Length);
left_ = left_.PadRight(maxLength, '0').ToUpperInvariant();
right_ = right_.PadRight(maxLength, '0').ToUpperInvariant();
for (int index = 0; index < maxLength; index++)
{
int leftOrderPosition = _customAlphanumericOrder.IndexOf(left_[index]);
int rightOrderPosition = _customAlphanumericOrder.IndexOf(right_[index]);
if (leftOrderPosition > rightOrderPosition)
{
return true;
}
if (leftOrderPosition < rightOrderPosition)
{
return false;
}
}
return false;
}
在我的例子中,如果left大于right,则算法返回true;如果left等于left,则算法返回false小于right。 然而,知道什么是预期的行为会很好。算法应该返回true并且为false?
答案 2 :(得分:1)
在ASCII表格中,数字和字母已按所需顺序显示。使用标准比较,不需要专门的算法。