Monday, October 2, 2023

Leetcode 386. Lexicographical Numbers

 这道题没什么特别巧妙的算法,就是纯考代码能力。对于当前数字的下一个数,我们首先考虑能否在后面加0,也就是下x10,如果可以就一直加;如果加不了,那么就在当前位置+1;如果还加不了,比如当前位置是9,或者当前数字已经等于最大值,就要退回前一位尝试+1, 如此不断尝试直到可以加到下一个数。这道题的难点在于分析出所有下一个数的可能性以及退出循环的条件。


class Solution {
public:
    vector<int> lexicalOrder(int n) {
        std::vector<int> result;
        int curr = 1;

        for (int i = 1; i <= n; ++i) {
            result.push_back(curr);
       
            if (curr * 10 <= n) {
                curr *= 10;
            } else if (curr % 10 != 9 && curr + 1 <= n) {
                curr++;
            } else {
                while ((curr / 10) % 10 == 9) {
                    curr /= 10;
                }
                curr = curr / 10 + 1;
            }
        }

        return result;
    }
};

No comments:

Post a Comment

Leetcode 316. Remove Duplicate Letters

 这道题表面问的是如何删除重复,实际在问如何从多个字符选取一个保留,从而让整个字符串按升序排列。那么策略就是对于高顺位的字符比如‘a',就要选靠前位置的保留,而低顺位字符如’z'则应该尽量选取靠后位置保留。 算法大概思路:每看到一个字符,我们要决定是否保留 1. ...