1

私は特定の解決策のために満たすためにかなり奇妙な要件を与えられました。要件は、現在の番号を指定して関数を記述し、2つ以上の連続する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

数値を10進形式、たとえばバイト配列に変換し、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 に答える