【面试向】2019 年微软秋招笔试 Problem 3
Problem
Check if a positive integer \(n\) can be written as sum of a positive integer and reverse of that integer.
Here, reverse of a positive integer is defined as the integer obtained by reversing the decimal representation of that integer.
For example, 121 = 92 + 29.
Analysis
若 \(x = y + r(y)\),其中 $r(y) := \text{reverse of \(y\)}$,则可以确定 \(y\) 是几位数。
若 \(x\) 的最高位上的数字大于 \(1\),则 \(y\) 与 \(x\) 位数相同。
若 \(x\) 的最高位上的数字等于 \(1\),则 \(x\) 的最高位可能是 $ y + r(y)$ 进位导致的,于是有两种可能
- \(y\) 与 \(x\) 位数相同
- \(y\) 比 \(x\) 少一位
此时,我们可以分别讨论这两种情况。确定了 \(y\) 的位数,进一步可以确定符合条件的 \(y\) 是否存在。我们只需要判断,在不进位的情况下,\(x\) 是否是回文串,特别的,当 \(y\) 的长度是奇数时,中间的那一位上必须是偶数。
Implementation
// 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;
}