1

我被赋予了一个相当奇怪的要求来满足特定的解决方案。要求是在给定当前数字的情况下编写一个函数,以查找下一个连续数字,该数字不包括具有两个或多个连续 6 的数字。

到目前为止,我有以下代码(在 C# 中),我用一些输入进行了测试,它可以工作。我知道这不是最有效的解决方案,但它可以完成工作,我只是想看看是否有更有效的方法来做到这一点。我采取的方法是将数字转换为字符串并使用简单的正则表达式来查看下一个序列是否是给定要求的有效序列。我也知道,一旦数字达到其 (2^31) - 1 限制,它将引发错误,但目前这不是问题。

public int GetNextSequenceNumber(int currentSequenceNumber)
{
    var nextSequenceCandidate = currentSequenceNumber + 1;
    var strNum = nextSequenceCandidate.ToString();

    if (IsValidSequenceNumber(strNum))
    {
        return nextSequenceCandidate;
    }
    else
    {
        do
        {
            strNum = (++nextSequenceCandidate).ToString();

        } while (!IsValidSequenceNumber(strNum));

        return nextSequenceCandidate;
    }
}

private bool IsValidSequenceNumber(string sequenceNumber)
{
    return !Regex.IsMatch(sequenceNumber, "[6]{2,}");
}

我在想还有另一种方法可以使用除法和模运算来找出数字位置并根据需要递增。任何输入表示赞赏,谢谢!

4

3 回答 3

1

我看到的最有效的解决方案实际上是使用字符串替换,但这仅在您递增并返回序列的所有值时才有效。只需替换6667.

如果允许任何起始数字,则必须在数字字符串中0第一次出现后附加与数字一样多的 s 。66

于 2012-07-19T00:42:05.257 回答
1

将您的数字转换为十进制格式,例如字节数组,扫描 66。

如果你找不到它,你就完了。否则,将其更改为 67,后跟全零。

于 2012-07-19T00:46:05.713 回答
0

我认为你最好的选择是不要考虑增加一个数字,而是考虑验证一个字符串。像下面这样的东西可以防止潜在的长时间循环运行,并且应该提供下一个可能没有“66”的最低值。

public static int GetNextSequenceNumber(int currentSequenceNumber)
    {
        int nextNumber = currentSequenceNumber += 1;
        string nextNumberStr = nextNumber.ToString();
        if (!nextNumberStr.Contains("66"))
        {
            return nextNumber;
        }
        else
        {
            //travel from left to right, find the 66, and increment the last 6 and reset the remaining values.
            bool doreset = false;
            bool lastwassix = false;
            string newString = string.Empty;
            for (int i = 0; i < nextNumberStr.Length; i++)
            {
                if (doreset) { newString += '0'; continue; }
                char c = nextNumberStr[i];
                if (c == '6')
                {
                    if (lastwassix)
                    {
                        newString += '7';
                        doreset = true;
                        continue;
                    }
                    lastwassix = true; 
                }
                newString += c;
            }
            return Convert.ToInt32(newString);
        }
    }
于 2012-07-19T01:03:25.953 回答