计算1-N中第K小的数字(按字典序排序)

    public static int calK(int n, int k) {
        if (k > n) {
            return 0;
        }
        int target = 1;
        for (int i = 2; i <= k; i++) {
            target = next(target, n);
        }
        return target;
    }

    private static int next(int start, int n) {
        if (start == n) {
            return start / 10 + 1;
        }

        if (start > 10 && start % 10 == 9) {
            return after9(start,n);
        }

        int tmp = start * 10;
        if (tmp <= n) {
            return tmp;
        }

        return start + 1;
    }

    private static int after9(int m, int n) {
        int tmp = m * 10;
        if (tmp <= n) {
            return tmp;
        }

        tmp = m + 1;
        tmp /= 10;
        while (tmp % 10 == 0) {
            tmp /= 10;
        }

        if (tmp < 10) {
            return tmp;
        }
        return (m + 1) / 10;
    }

猜你喜欢

转载自blog.csdn.net/qq_28665631/article/details/80598265
今日推荐