2019年の秋に、マイクロソフト書かれた問題点3を移動するための[インタビュー]

問題

正の整数$ N $はその整数の正の整数と逆の和として書くことができるかどうかをチェックします。
ここで、正の整数の逆は、その整数の10進表現を反転させることによって得られる整数として定義されます。

例えば、121は、92 + 29 =

分析

もし$ X = Y + R(Y)$、$のR(Y)= \テキスト{$ yを$の逆} $、$ Y $は数桁によって決定することができます。

数が最高レベルにある場合は$ X $ $ $ 1、$ Y $とX $ $同じ桁数よりも大きいです。
数が最高レベルである場合、X $ $ $ $ 1に等しい最上位ビットは、$ X $は$ Y + R(Y)$キャリーリードとすることができるので、可能な二つがあります

  1. $ Y $と数字の$ X $と同じ数
  2. $ Yは、$ Xの$ A未満を$

この時点で、我々は別にこの2つのケースを議論することができます。中央値は$ yを$を決定し、さらに$ yを$が存在する適格判定することができます。我々だけで、決定する必要が運ばない場合に、$ X $かパリンドローム配列、特に、$ Y $長が奇数、偶数でなければならない中間体である場合。

実装

// x = y + reverse(y)
// y 有 d.size() 位
bool check(vector<int> d) {
    for (int i = 0, j = (int)d.size() - 1; i < j; ++i, --j) {
        // case 1: d[i] == d[j]
        // case 2: d[i] == d[j] + 10
        // case 2: d[i] - 1 == d[j]
        // case 3: d[i] - 1 == d[j] + 10
        if (d[i] == d[j]) continue;
        if (d[i] == d[j] + 10) d[j - 1] -= 1;
        else if (d[i] - 1 == d[j]) {
            d[i + 1] += 10;
        }
        else if (d[i] - 1 == d[j] + 10) {
            d[i + 1] += 10;
            d[j - 1] -= 1;
        }
        else {
            return false;
        }
    }
    if (d.size() & 1) {
        int t = d[d.size() / 2];
        return t % 2 == 0 && t >= 0 && t <= 18;
    }
    return true;
}

bool solve(const char* s) {
    vector<int> d;
    for (int i = 0; s[i]; ++i) {
        d.push_back(s[i] - '0');
    }
    bool res = check(d);
    if (d.front() == 1 && d.size() > 1) {
        d[1] += 10;
        d.erase(d.begin());
        res |= check(d);
    }
    return res;
}

関連資料

https://stackoverflow.com/q/54694588

https://www.mathpages.com/home/kmath004/kmath004.htm

おすすめ

転載: www.cnblogs.com/Patt/p/11570165.html